我试图教一个神经网络如何在Keras中玩Noughts and Crosss,但是我的效率存在问题。我做了一些计时,发现这条线占用了80%的时间:
value, logits = neural_net.predict(numpy.array([game.make_image()]))
运行缓慢可能有两个原因:
由于我无法控制Keras的预测函数的速度,因此我决定看一下make_image函数,该函数占用了游戏板(出于效率原因,每个玩家在3D词典中代表一个位板),根据当前播放器对它进行定位,并添加一个3x3的板来表示它是哪个播放器,同时将其变成一个列表,以便可以将其输入到网络中。
代码如下:
def make_image(self):
return [[[self.board[self.to_play][key][key2] for key2 in self.board[self.to_play][key]]
for key in self.board[self.to_play]],
[[self.board[1 - self.to_play][key][key2] for key2 in self.board[1 - self.to_play][key]]
for key in self.board[1 - self.to_play]],
[[self.to_play for key2 in self.board[0][key]] for key in self.board[0]]]
有什么办法可以提高效率,还是大部分时间都花在了预测功能上?
注意:to_play变量为0或1,其中0是第一个要播放的玩家,而1是第二个要播放的玩家。
编辑: 正常播放的示例棋盘:
O|X|
|O|X
X|O|X
此板在词典中的表示形式:
{
0: {0: {0: 0, 1: 1, 2: 0},
1: {0: 0, 1: 0, 2: 1},
2: {0: 1, 1: 0, 2: 1}}
1: {0: {0: 1, 1: 0, 2: 0},
1: {0: 0, 1: 1, 2: 0},
2: {0: 0, 1: 1, 2: 0}}
}
想要的数组表示形式:
[
[[0, 1, 0],
[0, 0, 1],
[1, 0, 1]],
[[1, 0, 0],
[0, 1, 0],
[0, 1, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
]