我试图在Tensorflow中构建一个简约的梯度计算示例。但是我总是遇到 FailedPreconditionError 错误。这就是我在做的事情:
sess = tf.Session()
x1 = tf.placeholder(tf.float32, [None, 1], name="x1")
x2 = tf.placeholder(tf.float32, [None, 1], name="x2")
grad_a1_ph = tf.placeholder(tf.float32, [1], name="grad_a1_ph")
a1 = tf.Variable(tf.ones([1]), name="a1")
a2 = tf.Variable(tf.ones([1]), name="a2")
sess.run(tf.global_variables_initializer())
adam = tf.train.AdamOptimizer(learning_rate=0.01)
w = a1**2*x1**2 + a2**2*x2**2
所以我试图最小化函数w(x1,x2),它只是a1,a2,x1和x2中的二次函数,因此a1 = 0应该给出最小值。
grad_a1 = adam.compute_gradients(loss=w, var_list=[a1])
我可以在x1 = 2,x2 = 1
时计算dw / da1x1_np = 2 * np.ones([1]).reshape(1, 1)
x2_np = 1 * np.ones([1]).reshape(1, 1)
grad_a1_buffer = sess.run(grad_a1, feed_dict={x1:x1_np, x2:x2_np})
它给出了预期的结果8.
现在我尝试使用以下代码应用我刚刚计算的渐变:
updateGrads = adam.apply_gradients(zip([grad_a1_ph],[a1]))
sess.run(updateGrads, feed_dict={grad_a1_ph:grad_a1_buffer[0][0]})
我在sess.run()行的a1上得到 FailedPreconditionError :
ailedPreconditionError: Attempting to use uninitialized value beta1_power
[[Node: beta1_power/read = Identity[T=DT_FLOAT, _class=["loc:@a1"], _device="/job:localhost/replica:0/task:0/gpu:0"](beta1_power)]]
变量 a1 肯定是初始化的,因为如果我为x1和x2提供值,我没有任何计算w或dw / da1的问题。
如果有人指出我的例子可能出错,那将是一个很大的帮助。
非常感谢提前 马丁
答案 0 :(得分:0)
您需要致电
sess.run(tf.global_variables_initializer())
>>之后的
adam = tf.train.AdamOptimizer(learning_rate=0.01)
或任何其他创建变量的操作。