Я пытаюсь создать сверточную нейронную сеть, которая принимает позицию на шахматной доске и оценивает ее, выплевывая число многоножек. на каждую позицию в игре (1 образец для e4, 1 образец для e4 e5, et c до мата). Единственная особенность - это массив 8x8x6 для каждой доски, 6 - это 1, 0 или -1 в зависимости от того, чья фигура там, с индексами, относящимися к каждому типу фигур ([1,0,0,0,0,0 ] - пешка), а 8x8 соответствует полям доски.
Я знаю, что для шахмат это своего рода небольшой образец позиций - у меня есть больший набор данных с большим количеством игр, но это займет долго обрабатывать, поэтому моей целью было получить работоспособную модель, прежде чем тратить время и вычислительные мощности на ее предварительную обработку.
Моя примерно самая эффективная модель после нескольких дней настройки:
# model configuration
# takes in a board input and outputs a centipawn value
from tensorflow.keras.callbacks import EarlyStopping, TensorBoard
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.optimizers import SGD, Adam, RMSprop
from tensorflow.keras.regularizers import L1, L2
from tensorflow.keras.metrics import MeanAbsoluteError
from tensorflow.keras.initializers import GlorotUniform
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
early_stop = EarlyStopping(monitor='val_loss', mode='min', verbose = 1, patience = 50)
adamOpti = Adam(learning_rate=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,
name='Adam')
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
initializer = GlorotUniform()
regularizerl2 = L2(l2 = 0.1)
EPOCHS = 5000
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D, BatchNormalization
model = Sequential()
model.add(Conv2D(36, (3, 3), activation='relu', input_shape=(8,8,6), padding='same', kernel_regularizer=regularizerl2))
model.add(Conv2D(36, (3, 3), activation='relu', padding='same', data_format="channels_last", kernel_regularizer=regularizerl2))
model.add(BatchNormalization())
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(64, activation = 'relu', kernel_initializer=initializer, kernel_regularizer=regularizerl2))
model.add(Dropout(0.5))
model.add(Dense(1))
# , metrics=[MeanAbsoluteError(name='mean_absolute_error', dtype=None)]
model.compile(loss='mse', optimizer=adamOpti)
# training
model.fit(X_train, y_train, epochs = EPOCHS, validation_data = (X_test, y_test), batch_size=1024, callbacks=[tensorboard_callback, early_stop])
Я пробовал варьировать количество полностью связанных и сверточных слоев, но большее количество обоих, похоже, увеличивает переоснащение. В моей исходной нейронной сети не было регуляризации или пакетной нормализации, которые отчасти помогали, но ничего примечательного. Я изменил скорость обучения и количество нейронов на слой. Независимо от того, что я делаю, похоже, это никогда не окажет особенно существенного влияния на производительность нейронной сети. Ниже приведена среднеквадратичная ошибка моей последней модели, которая также имела среднюю абсолютную ошибку 470,374 сантипешек (в диапазоне от -10000 до 10000, но большинство позиций только в пределах -1500-1500) введите описание изображения здесь
Я не уверен, что мой подход неправильный, мои гиперпараметры / структура отключены, мое представление данных неверно или что-то еще. Я был бы признателен, если бы мне помог кто-то с более глубокими познаниями в шахматном программировании или сверточных нейронных сетях. по акции fi sh, однако позиции передаются в мою нейронную сеть без данных хода.