在过去的几周里,我一直在尝试使用类似 Stockfish 的国际象棋评估神经网络,但无济于事。我想就为什么我目前的方法没有奏效得到一些其他的意见。
输入:一热编码板件。我有大约 6000 万个独特的例子。评估介于 -15 和 15 之间(任何更大或更小的值都被带到 15 或 -15)
输出:代表 Stockfish 评估的单个数字。
我已经尝试过完全连接和卷积模型,但都没有很好地工作。下面是一些 Tensorflow 代码,可以让您了解结构的外观:
卷积模型:
import tensorflow as tf
def block(filters, x, res=None):
if res is not None:
x = tf.keras.layers.concatenate([x, res])
x = tf.keras.layers.Conv2D(filters=filters, kernel_size=3, padding='same', activation='relu', kernel_initializer='he_normal')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.MaxPooling2D(pool_size=2, strides=1, padding='same')(x)
return x
board = tf.keras.Input(shape=(8, 8, 12))
conv1 = block(64, board)
conv2 = block(128, conv1)
conv3 = block(256, conv2)
conv4 = block(512, conv3, conv3)
conv5 = block(1024, conv4, conv2)
conv6 = block(1024, conv5, conv1)
conv7 = block(512, conv6)
x = tf.keras.layers.Flatten()(conv7)
x = tf.keras.layers.Dense(128, activation='relu')(x)
x = tf.keras.layers.Dense(32, activation='relu')(x)
x = tf.keras.layers.Dense(1)(x)
全连接模型:
import tensorflow as tf
board = tf.keras.Input(shape=(8, 8, 12))
x = tf.keras.layers.Flatten()(board)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu', kernel_regularizer='l2')(x)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(1024, activation='relu', kernel_regularizer='l2')(x)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(1024, activation='relu', kernel_regularizer='l2')(x)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(256, activation='relu')(x)
x = tf.keras.layers.Dense(1)(x)
只是添加一些关于当前结果的注释,它们是不错的(例如,在 -15 和 15 之间评估的 Stockfish 的均方误差约为 7)。早期的比赛也打得相当不错,但后期比赛变得非常糟糕(引擎无法评估主教带走敌后是好的)。我的评估网络也将四步将死评估为黑色偏爱。