Я пытаюсь разработать модель нейронной сети из-за этой статьи: https://www.cs.tau.ac.il/~wolf/papers/deepchess.pdf Я пытался сделать это без использования автоматического кодера, и я получил модель с точностью ~ 75%, что недостаточно, потому что классификация не не работает так, как должно. Авторы статьи используют автоэнкодеры для повышения точности. Они достигли точности около 98%.
Затем я попытался использовать автоэнкодер, код обучения первого слоя ниже:
class AutoEncoder:
def __init__(self, input_dim, encoding_dim, input_data):
self.input_dim = input_dim
self.encoding_dim = encoding_dim
self.x = input_data
self.model = None
def _encoder(self):
inputs = Input(shape=(self.input_dim,))
encoded = Dense(self.encoding_dim, activation='relu')(inputs)
model = Model(inputs, encoded)
self.encoder = model
return model
def _decoder(self):
inputs = Input(shape=(self.encoding_dim,))
decoded = Dense(self.input_dim)(inputs)
model = Model(inputs, decoded)
self.decoder = model
return model
def encoder_decoder(self):
ec = self._encoder()
dc = self._decoder()
inputs = Input(shape=(self.input_dim,))
ec_out = ec(inputs)
dc_out = dc(ec_out)
model = Model(inputs, dc_out)
self.model = model
return model
def fit(self, batch_size, epochs):
optimizer = keras.optimizers.Adam(lr=0.005, decay=0.02)
self.model.compile(optimizer=optimizer, loss='mse')
log_dir = './log/'
tbCallBack = keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=0, write_graph=True, write_images=True)
self.model.fit(self.x, self.x,
epochs=epochs,
batch_size=batch_size,
callbacks=[tbCallBack])
def save(self):
if not os.path.exists(r'./weights'):
os.mkdir(r'./weights')
else:
self.encoder.save(r'./weights/encoder_weights_' + str(self.encoding_dim) + '.h5')
self.decoder.save(r'./weights/decoder_weights_' + str(self.encoding_dim) + '.h5')
self.model.save(r'./weights/ae_weights_' + str(self.encoding_dim) + '.h5')
def init_data(input_dim):
white_boards_file = "./data/white.npy"
black_boards_file = "./data/black.npy"
num_whites = 1000000
num_blacks = 1000000
x = np.zeros((2000000, input_dim))
x[:num_whites] = np.load(white_boards_file)
x[num_blacks:] = np.load(black_boards_file)
np.random.shuffle(x)
return x
input_data = init_data(773)
ae = AutoEncoder(773, 600, input_data)
ae.encoder_decoder()
ae.fit(256, epochs=200)
ae.save()
Точность при использовании автоэнкодера составляет около 60%. Пример кодирования декодирующей части данных: необработанные данные: [[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. ... Закодированные данные: [[0.96 0. 0. 0. 0. 0. 0.69 0. 0. 0. 1.12 0. 0.94 0.94 0.23 0. 0. 0. 0. 1.26 1.09 0. 1,02 0,14 0. 0,06 0. 0. 0,74 1,29 ... Декодированные данные: [[0,01 0,6 -0,05 -0,02 -0,02 0,02 -0,01 0,17 -0,03 -0. 0. -0.4 0.04 0.26 -0.19 -0.19 0. 0.04 -0. 0,02 0,02 -0,01 0. 0,12 0,11 0,11 -0,19 0,07 -0,02 ...
Использование автоэнкодера имеет какое-либо значение или у меня возникли ошибки при мысли?