Tensorflow:如何训练NeuralNet?

时间:2019-05-01 20:43:30

标签: python tensorflow neural-network

我受到TensorFlow的无限启发,并想编写一个具有神经网络的AI,该神经网络可以优化单人棋盘游戏的策略。我运行了代码,但是策略没有改善。我的游戏实施似乎工作正常。 (现在很简单:获取资源A或资源B,或将所有资源交换为victoryPoints,所以明智的做法是累积一些交换资源的资源。) 我想我不是在训练模型。

我试图理解代码示例,但对于python入门者来说只是很多。 所以我所知道的是,我希望有一个评估状态的模型,因此它获得状态作为输入,而输出只是一个值:状态的好坏,因此期望获得多少历史分数。 我用它来预测接下来的〜3轮,然后根据神经网络(NeuralNetwork)选择能在〜3轮中获得最佳结果的动作(开始时使用的是随机选择,但会减少)。并重新开始。 我真的不确定这种“预测”(我认为这是评估)和“更新”(我希望是培训)如何工作。

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参数None具有无效的type)。 (

与没有更新行一样,代码始终运行,但是策略非常糟糕,几乎没有得分(我想随机策略会更好)。 (

非常感谢您的提前帮助!

1 个答案:

答案 0 :(得分:0)

好的,基本上我没有得到

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})

AI仍然很愚蠢,经常收敛到0点,但这可能是我在其他时候犯的错误。