我受到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)。 (
与没有更新行一样,代码始终运行,但是策略非常糟糕,几乎没有得分(我想随机策略会更好)。 (
非常感谢您的提前帮助!
答案 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点,但这可能是我在其他时候犯的错误。