Тензорный поток: как тренировать NeuralNet? - PullRequest
0 голосов
/ 01 мая 2019

Я вдохновлен возможностями TensorFlow и хочу написать ИИ с нейронной сетью, который оптимизирует стратегию для однопользовательской настольной игры. Я запускаю код, но стратегии не улучшаются. Кажется, что моя игра импелментации работает нормально. (сейчас все просто: получите ресурс A, или ресурс B, или обменяйте все ресурсы на victoryPoints, так что разумнее было бы собрать некоторые ресурсы, которые их обменивают.) Думаю, я не тренирую модель.

Я пытался понять примеры кода, но это немного для начинающего Python. Итак, что я знаю, так это то, что я хочу иметь модель, которая оценивает состояние, чтобы оно получало состояние в качестве входных данных, а выходные данные представляли собой только одно значение: насколько хорошее состояние, так сколько ожидаемых баллов должно быть набрано , Это я использую для прогнозирования следующих ~ 3 раундов, а затем выбираю действие, которое приводит к наилучшему результату в ~ 3 раундах в соответствии с NeuralNetwork (и в начале вместо этого используется случайный выбор, получая меньше); и начать все сначала. Я действительно не уверен, как это «предсказать» (я думаю, это оценка) и «обновление» (я надеюсь, это тренинг) должно работать.

class NeuralNet():
def __init__(self):
     # Placeholders for inputs (x) and outputs(y)

    self.x_pl = tf.placeholder(tf.float32, shape=[None, game.getStateSize(game())], name='X')
    self.y_pl = tf.placeholder(shape=[None], dtype=tf.float32, name="y")

    self.fc1 = tf.contrib.layers.fully_connected(self.x_pl, 64)
    self.fc2 = tf.contrib.layers.fully_connected(self.fc1, 64)
    self.output = tf.contrib.layers.fully_connected(self.fc2, 1)
    self.value = self.output[0]

    self.loss = tf.reduce_sum(tf.square(self.y_pl-self.output))

    self.train = tf.train.GradientDescentOptimizer(1.0).minimize(self.loss)

def predict(self, sess, s):
    """
    Predicts value of state(?).
    Args:
      sess: Tensorflow session
      s: State input of shape [batch_size, 4, 160, 160, 3]
    Returns:
      Tensor containing the estimated
      state value.
    """
    s = np.expand_dims(s, 0)
    return sess.run(self.value, {self.x_pl: s})

def update(self, sess, s, y):
    """
    Updates the NeuralNet so its predicting better(?).
    Args:
      sess: Tensorflow session object
      s: State of game
      y: VictoryPoints Actualy Earned at the end
    Returns:
      nothing yet
    """
    s = np.expand_dims(s, 0)
    y = np.expand_dims(y, 0)
    feed_dict = {self.x_pl: s, self.y_pl: y}
    sess.run([WHAT_TO_PUT_HERE, tf.contrib.framework.get_global_step(), self.train, self.loss], feed_dict)

в основном классе называется следующее:

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
deep_q_learning(sess)

и затем я в основном прохожу через множество эпох / эпизодов и играю по одной игре в каждую эпоху. для прогнозов, которые мне нужны, я использую

neurnet.predict(sess, g.getGameState())

и я пытаюсь использовать

nn.update(sess, state, game.points)

в конце эпохи обновления, но сейчас это не работает технически (TypeError: Аргумент Fetch. Нет, недопустимый тип). (

Как и без строки обновления, код проходит, но стратегии настолько плохи, что едва ли дают какие-либо победные очки (я думаю, что случайные стратегии были бы лучше). (

Большое спасибо за вашу помощь заранее!

1 Ответ

0 голосов
/ 02 мая 2019

хорошо, в основном я не получил это

self.train = tf.train.GradientDescentOptimizer(self.decent_pl[0]).minimize(self.loss)

устанавливает метод"train", а sess.run вызывает метод с параметрами. поэтому я написал новый метод обучения, который работает в основном.

def learn(self, sess, sta, vicp, dec):
    sta = np.expand_dims(sta, 0)
    vicp = np.expand_dims(vicp, 0)
    dec = np.expand_dims(dec, 0)
    sess.run(self.train, feed_dict={self.x_pl: sta, self.y_pl: vicp, self.decent_pl: dec})

ИИ все еще действует глупо и часто сходится к 0 баллам, но это может быть моей ошибкой, вероятно, в какой-то другой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...