无法在tensorflow中使用占位符初始化变量

时间:2019-03-14 21:59:58

标签: python tensorflow deep-learning

如何使用占位符作为初始值创建变量?下图细分为:

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_1' with dtype float
     [[node Placeholder_1 (defined at <ipython-input-10-b8d54264dc85>:3)  = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

我的代码:

tf.reset_default_graph()
a = tf.placeholder(dtype=tf.float32,shape=())
d = tf.placeholder(dtype=tf.float32,shape=())
b = tf.get_variable(name='b',initializer=d)
c=a+d
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(c, feed_dict={a:5.,d:10.}))

tensorflow中有关初始化程序的文档说:

  

变量的初始化器(如果已创建)。可以是初始化程序对象或张量。如果是张量,除非validate_shape为False,否则必须知道其形状。

但是,如果我注释掉我创建b所在的行,则该代码似乎可以运行。我的获取甚至不依赖于b。

如何创建根据某个占位符初始化的变量?

1 个答案:

答案 0 :(得分:1)

我认为您的问题已在https://github.com/tensorflow/tensorflow/issues/4920

中进行了描述

我的解决方法是使用tf.assign,其作用类似于惰性初始化程序,其形状应在dtf.zeros_like的推断下。为了弄清楚它是如何工作的,我将b设置为资源变量,以便在sess.run调用之间保持状态。

tf.reset_default_graph()
a = tf.placeholder(dtype=tf.float32,shape=(), name='a')
d = tf.placeholder(dtype=tf.float32,shape=(), name='d')
b = tf.get_variable(name='b', initializer=tf.zeros_like(d), use_resource=True)
b_init = tf.assign(b, d)
c=a+d
add_one = tf.assign(b,tf.add(b,tf.ones_like(b)))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())   
    print(sess.run([c, b_init], feed_dict={a:5.,d:10.}))    
    for i in range(10): 
        sess.run(add_one)
        print(sess.run([c,b], feed_dict={a:5.,d:10.}))

输出

[15.0, 10.0]
[15.0, 11.0]
[15.0, 12.0]
[15.0, 13.0]
[15.0, 14.0]
[15.0, 15.0]
[15.0, 16.0]
[15.0, 17.0]
[15.0, 18.0]
[15.0, 19.0]
[15.0, 20.0]