【问题标题】:Cannot initialize variable with a placeholder in tensorflow无法在张量流中使用占位符初始化变量
【发布时间】:2019-03-14 21:59:57
【问题描述】:

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

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 的行,代码似乎可以运行。我的 fetch 甚至不依赖于 b。

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

【问题讨论】:

    标签: python tensorflow deep-learning


    【解决方案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]
    

    【讨论】:

    • 感谢您的建议。您能否帮助我确认github.com/tensorflow/tensorflow/issues/13351 的解决方案是否有效。我无法让它工作
    • 您的解决方案在每次迭代中分配 b 等于 d,这不是预期的行为。
    • 我已经编辑了代码来说明你应该如何使用它。拆分 assignget_variable 并仅在循环前使用 assign。我添加了add_one 操作,它在b 上加一,并为其分配了加法值以说明它有效。此外,我必须使用资源变量,以便它在sess.run 调用之间保持状态。希望它能澄清事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多