我一直在和朋友一起写一个国际象棋引擎,引擎本身已经非常好(2700+ CCRL)。我们的想法是使用神经网络来更好地评估位置。
输入到网络
因为网络的输出很大程度上取决于哪一方必须移动,所以我们使用输入的前半部分来解析谁必须移动的位置,而后半部分用于分析对手的位置。事实上,我们为每个部分和每个正方形都有一个输入,这将导致 12x64 输入。我们的想法也包括对手国王的位置。所以每一方都有 6x64 输入,对于每个方格,对手国王可以是 -> 6x64x64。总的来说,这会产生 12x64x64 二进制输入值,其中最多设置 32 个。
图层
下一层由 64 个神经元组成,其中前 32 个神经元只接受前半部分输入特征的输入,后 32 个只接受后半部分输入特征的输入。
它遵循一个具有 32 个完全连接的神经元的层,输出层只有一个输出。
激活功能
我们在隐藏层使用 LeakyReLU,在输出使用线性激活函数。
训练
最初,我想在大约 100 万个位置上训练网络,但这需要很长时间。位置本身的目标值在 -20 到 20 的范围内。我使用 ADAM 的随机梯度下降,学习率为 0.0001,MSE 作为损失函数。
我遇到的问题是,即使训练这 100 万个职位也需要很长时间。目标是稍后在 3 亿个位置上进行训练。
我不确定在哪里可以改善培训进度。
下面是显示超过 1000 次迭代的训练进度的图表
每次迭代的更改如下所示:
我希望有人能给我一两个提示,告诉我我可以改进什么,以便更快地训练网络。我很高兴有任何建议!
问候,芬恩
编辑 1
正如建议的那样,我应该将我的网络转换为 keras。我在让稀疏输入运行时遇到问题。
import keras
from keras.layers import Input, Concatenate, Dense, LeakyReLU
from keras.models import Model
from keras import backend as K
import numpy as np
# trainX1 = tf.SparseTensor(indices=[[0,0], [0,1]], values=[1, 2], dense_shape=[1,24576])
# trainX2 = tf.SparseTensor(indices=[[0,0], [0,1]], values=[1, 2], dense_shape=[1,24576])
#
# trainY = np.random.rand(1)
trainX1 = np.random.random((10000,24576))
trainX2 = np.random.random((10000,24576))
trainY = np.zeros((10000,1))
#input for player to move
activeInput = Input((64*64*6,))
inactiveInput = Input((64*64*6,))
denseActive = Dense(64)(activeInput)
denseInactive = Dense(64)(inactiveInput)
act1 = LeakyReLU(alpha=0.1)(denseActive)
act2 = LeakyReLU(alpha=0.1)(denseInactive)
concat_layer= Concatenate()([act1, act2])
dense1 = Dense(32)(concat_layer)
act3 = LeakyReLU(alpha=0.1)(dense1)
output = Dense(1, activation="linear")(act3)
model = Model(inputs=[activeInput, inactiveInput], outputs=output)
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
# print(model.summary())
print(model.fit([trainX1,trainX2], trainY, epochs=1))
如果我sparse=True
用于 Dense 层,它会抛出一些异常。如果有人可以帮助我创建稀疏输入向量,我会很高兴。