为什么在为深度学习任务表示棋盘时使用逻辑移位?
Why are logical shifts used when representing a chess board for a Deep Learning task?
最近我遇到了一位正在开发他自己的基于深度学习的国际象棋引擎的 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 位逻辑左移)。但是,我不完全确定这个假设是否正确,我真的不知道 运行 在棋盘表示的上下文中这些操作背后的原因是什么。
这些是二进制文件:
电话:0001
号码:0010
乙:0011
回复:0100
问:0101
克:0110
p: 1001
编号:1010
b: 1011
r: 1100
问:1101
k: 1110
可以看到,所有黑色棋子左边的位永远为1,白色棋子左边的位永远为0。这就是跳过 7 和 8 的原因。
有
(old_boardstate>> 3) & 1
颜色指示位一直向右移动。 & 1 删除所有不需要的位。所以这个表达式 returns 如果棋子的颜色是黑色则为 1,否则 returns 为 0。
其他三个位表示独立于颜色的棋子类型。
你不懂的位运算是用来从8位整数中取出一个个位来存储到numpy数组中的。 numpy 数组是神经网络的输入,具有 5x8x8 的维度,因为五个输入神经元用于表示棋盘的每个区域。
最近我遇到了一位正在开发他自己的基于深度学习的国际象棋引擎的 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 位逻辑左移)。但是,我不完全确定这个假设是否正确,我真的不知道 运行 在棋盘表示的上下文中这些操作背后的原因是什么。
这些是二进制文件: 电话:0001 号码:0010 乙:0011 回复:0100 问:0101 克:0110 p: 1001 编号:1010 b: 1011 r: 1100 问:1101 k: 1110
可以看到,所有黑色棋子左边的位永远为1,白色棋子左边的位永远为0。这就是跳过 7 和 8 的原因。 有
(old_boardstate>> 3) & 1
颜色指示位一直向右移动。 & 1 删除所有不需要的位。所以这个表达式 returns 如果棋子的颜色是黑色则为 1,否则 returns 为 0。 其他三个位表示独立于颜色的棋子类型。 你不懂的位运算是用来从8位整数中取出一个个位来存储到numpy数组中的。 numpy 数组是神经网络的输入,具有 5x8x8 的维度,因为五个输入神经元用于表示棋盘的每个区域。