最近,我遇到了一个 twitch 主播,他正在开发自己的基于深度学习的国际象棋引擎。我正在浏览我在视频中看到的代码,我不太明白的一件事是,为什么他在准备输入数据(即棋盘表示)进行训练时使用逻辑移位。以下是他遵循的粗略步骤:
- 他以“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:
# 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 位逻辑左移)。但是,我不完全确定这个假设是否正确,并且我真的不知道在棋盘表示的上下文中运行这些操作的原因是什么。