Автоэнкодер не повышает точность модели - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь разработать модель нейронной сети из-за этой статьи: 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 ...

Использование автоэнкодера имеет какое-либо значение или у меня возникли ошибки при мысли?

...