Python 为什么在为深度学习任务代表棋盘时使用逻辑移位?

Python 为什么在为深度学习任务代表棋盘时使用逻辑移位?,python,machine-learning,deep-learning,chess,python-chess,Python,Machine Learning,Deep Learning,Chess,Python Chess,最近我遇到了一个twitch streamer,他正在开发自己的基于深度学习的国际象棋引擎。我正在浏览视频中看到的代码,有一件事我不太明白,为什么他在准备训练输入数据(即棋盘表示)时使用逻辑移位。以下是他遵循的粗略步骤: 他获取了一个“pgn”格式的国际象棋游戏数据集 对于每个游戏中的每个移动,都会出现一个新的棋盘状态。这些新状态中的每一个都以以下方式序列化: 他创建了一个8x8矩阵,表示此特定移动后的8x8板 矩阵应该存储8位无符号整数 他将所有棋子放在棋盘上(即矩阵中) 白色部分的定义如下

最近我遇到了一个twitch streamer,他正在开发自己的基于深度学习的国际象棋引擎。我正在浏览视频中看到的代码,有一件事我不太明白,为什么他在准备训练输入数据(即棋盘表示)时使用逻辑移位。以下是他遵循的粗略步骤:

  • 他获取了一个“pgn”格式的国际象棋游戏数据集
  • 对于每个游戏中的每个移动,都会出现一个新的棋盘状态。这些新状态中的每一个都以以下方式序列化:
    • 他创建了一个8x8矩阵,表示此特定移动后的8x8板
    • 矩阵应该存储8位无符号整数
    • 他将所有棋子放在棋盘上(即矩阵中)
    • 白色部分的定义如下:
      {“P:1,N:2,B:3,R:4,Q:5,K:6}
    • 黑色部分的定义如下:
      {p:9,n:10,b:11,r:12,q:13,k:14}
    • 这意味着,例如,白兵在矩阵中存储为“1”,而黑皇后将存储为“13”
  • 序列化电路板后,他通过执行一些我不太理解的逻辑位操作,从原始8x8矩阵生成最终的电路板状态。此外,新生成的(即最终板状态)不是8x8,而是5x8x8:

  • 我想知道有谁能帮我理解这些操作背后的逻辑吗?据我所知,他希望根据不同的逻辑移位(3、2、1和0位逻辑左移位)创建5种不同的8x8板表示。但是,我不能完全确定这个假设是否正确,我也不知道在棋盘表示的上下文中运行这些操作背后的原因是什么。

    这些是二进制的: P:0001 编号:0010 B:0011 R:0100 Q:0101 K:0110 p:1001 n:1010 b:1011 r:1100 q:1101 k:1110

    您可以看到,所有黑色片段的左位始终为1,而白色片段的左位始终为0。这就是跳过7和8的原因。 与

    (旧邦>>3)和1

    颜色指示位一直向右移动。&1删除了所有不需要的内容。因此,如果工件的颜色为黑色,则该表达式返回1,否则返回0。 其他三位表示独立于颜色的工件类型。 您不了解的位操作用于从8位整数中获取各个位,以将它们存储在numpy数组中。numpy阵列是神经网络的输入,具有5x8x8维,因为五个输入神经元用于表示电路板的每个字段

    
     # Init new board state
     final_boardstate = np.zeros((5, 8, 8), np.uint8)
    
     # old_boardstate is the initial 8x8 matrix containing uint8 values
       
     # Bit operations that I don't understant
     final_boardstate[0] = (old_boardstate>> 3) & 1
     final_boardstate[1] = (old_boardstate>> 2) & 1
     final_boardstate[2] = (old_boardstate >> 1) & 1
     final_boardstate[3] = (old_boardstate >> 0) & 1