如何使用占位符作为初始值创建变量?下图细分为:
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。
如何创建根据某个占位符初始化的变量?
答案 0 :(得分:1)
我认为您的问题已在https://github.com/tensorflow/tensorflow/issues/4920
中进行了描述我的解决方法是使用tf.assign
,其作用类似于惰性初始化程序,其形状应在d
与tf.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]