tensorflow提示没有初始化Attempting to use uninitialized value

昨天在看西瓜书强化学习的章节时,想对照着伪代码写一下\epsilon-greedy的代码:

import tensorflow as tf
import numpy as np

R = tf.Variable([1.0, 2.0, 3.0, 4.0, 5.0], dtype=tf.float32, name="R") # 5个摇臂的Reward函数



def epsilon_greedy(K, R, T, epsilon):
    Q = tf.Variable(tf.zeros([5], name="Q"))
    r = tf.Variable(0., dtype=tf.float32, name="r")
    count = tf.Variable(tf.zeros([K], name="count"))
    for t in range(T):
        sample_val = tf.random_uniform([1], minval=0, maxval=1, dtype=tf.float32, name="random_value")
        if True: #这里待更新,有误
            k = tf.random_uniform(shape=[], minval=0, maxval=K-1, dtype=tf.int32, name="k")
        else:
            k = tf.argmax(R, name="k")
        v = R[k]
        r = r + v
        Q[k].assign((Q[k]*count[k] + v) / (count[k] + 1))
        count[k].assign(count[k] + 1)
    return Q, r

with tf.Session() as sess:
    tf.summary.FileWriter("logs/", sess.graph)
    sess.run(tf.global_variables_initializer())
    Q, r = epsilon_greedy(R.get_shape()[-1], R, T=10, epsilon=0.1)
    print("Q: {}, r: {}".format(sess.run(Q), sess.run(r)))

当我写完代码的时候,出现了一个非常诡异的Error:

出错信息

变量没有初始化?奇怪,我明明加了sess.run(tf.global_variables_initializer())呀

修改后的代码

经过一番倒腾之后,终于发现了问题。

tf的计算图是在条用epsilon函数的时候进行构建的,也就是说,我在init的时候Variables都还没有声明,因此肯定会显示没有init的情况,解决方法是:将sess.run(tf.global_variables_initializer())移动到epsilon函数之后就好了:

真是一个小小的细节,让我debug了好久好久。

发表评论

电子邮件地址不会被公开。 必填项已用*标注