Как правильно формировать входной слой для модели Keras для обработки различных входных форм в tensorflow 2.2 - PullRequest
0 голосов
/ 20 июня 2020

Я следил за онлайн-руководством по созданию нейронной сети для игры в TicTacToe (ссылка на их репо): https://github.com/fcarsten/tic-tac-toe/blob/master/tic_tac_toe/DirectPolicyAgent.py

К сожалению, их подход использовал тензорный поток v1.x, поэтому после чтобы заставить его работать в 1.x Я сам пытался преобразовать его в 2.x. В своей программе он использовал вспомогательный класс TFSessionManager, который он написал для выполнения прогнозов, а также для обучения модели на основе игр, в которые он играл. В этих ситуациях он передал feed_dict, который, кажется, является эксклюзивным для tensorflow 1.x и позволяет использовать переменные входные данные. Для обучения входных данных dict имел 3 массива 1d, историю ходов, историю состояний доски и историю вознаграждений на каждом ходу игры, а dict во время прогнозирования просто передается в одном массиве 1d, содержащем текущее состояние доски

Я преобразовал большую часть этого в tenorflow 2.2 с помощью других руководств (в основном это посвящено градиентам политики: https://adventuresinmachinelearning.com/policy-gradient-tensorflow-2/). Когда я определяю форму входного слоя, она работает для прохождения первой игры, но потом, когда я пытаюсь использовать ту же форму для обучения, происходит сбой, указывающий, что мои формы несовместимы.

Моя модель:

self.model = tf.keras.Sequential([
            layers.Dense(9, kernel_initializer=keras.initializers.he_normal(), name='input'),
            layers.Dense(81, activation='relu', kernel_initializer=keras.initializers.he_normal(), name='hidden'),
            layers.Dense(9, activation='softmax', name='output')
        ])

self.model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.01),
                           loss='categorical_crossentropy')

Моя доска имеет форму (9,1) при вводе в модель во время игры, что, как я уже сказал, работает правильно.

Во время обучения у меня есть 3 массива. Первый - это список всех состояний доски, его форма (x, 9, 1) в зависимости от продолжительности игры. Второй - это индекс хода, выполненного нейронной сетью формы (x, 1), снова в зависимости от продолжительности игры. Третий - это размер вознаграждения, который я получаю за каждый сделанный ход в зависимости от результата игры. Это также форма (x, 1) в зависимости от продолжительности игры.

Что я хочу сделать, так это ввести состояния доски и ходы, сделанные в качестве входных данных, и значения вознаграждения в качестве выходных данных, но я не уверен, как это сделать. тренироваться на этих данных с моей текущей формой или как преобразовать эти входные данные в форму, которая будет принята моей моделью. Во второй ссылке, за которой я следил, автор использовал train_on_batch вместо fit, но, судя по тому, что я видел, здесь это не имеет значения.

Когда я запускаю программу только с состояниями и наградами, она выдает ошибку ValueError: Фигуры (x, 1) и (x, 9,9) несовместимы, что также любопытно, потому что я проверил, что состояния (x, 9,1), поэтому я не знаю, почему там написано (x, 9,9). Я также не знаю, должен ли я это делать, поскольку я вообще не ввожу массив истории ходов.

Любая помощь с этим будет принята с благодарностью, заранее спасибо за ваше время.

...