0

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

  1. 他以“pgn”格式获取了一个包含国际象棋游戏的数据集
  2. 对于每场比赛中的每一步,都会出现一个新的棋盘状态。这些新状态中的每一个都以下列方式序列化:
  • 他创建了一个 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”
  1. 在对电路板进行序列化后,他通过执行一些我不太理解的逻辑位操作,从原始的 8x8 矩阵生成最终的电路板状态。新生成的(即最终的棋盘状态)也不是 8x8 而是 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 

我想知道有人能帮我理解这些操作背后的一些逻辑吗?据我了解,他想创建 5 个不同的 8x8 板表示,每个都基于不同的逻辑移位(3、2、1 和 0 位逻辑左移)。但是,我不完全确定这个假设是否正确,并且我真的不知道在棋盘表示的上下文中运行这些操作的原因是什么。

4

1 回答 1

1

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

您可以看到所有黑色棋子的左边位始终为 1,而白色棋子的左边位始终为零。这就是跳过 7 和 8 的原因。和

(old_boardstate>> 3) & 1

颜色指示位一直向右移动。& 1 删除所有其他不是想要的位。因此,如果棋子的颜色为黑色,则此表达式返回 1,否则返回 0。其他三位表示棋子类型,与颜色无关。您不了解的位操作用于从 8 位整数中取出各个位以将它们存储在 numpy 数组中。numpy 数组是神经网络的输入,尺寸为 5x8x8,因为五个输入神经元用于表示棋盘的每个字段。

于 2021-03-24T20:01:13.710 回答