如何填充占位符?

21

我想实现一个简单的前馈神经网络。但是,我无法弄清如何提供一个Placeholder。以下是示例:

我试图实现一个简单的前馈神经网络。然而,我不能弄清如何为一个Placeholder提供输入。这是一个例子:

import tensorflow as tf

num_input  = 2
num_hidden = 3
num_output = 2

x  = tf.placeholder("float", [num_input, 1])
W_hidden = tf.Variable(tf.zeros([num_hidden, num_input]))
W_out    = tf.Variable(tf.zeros([num_output, num_hidden]))
b_hidden = tf.Variable(tf.zeros([num_hidden]))
b_out    = tf.Variable(tf.zeros([num_output]))

h = tf.nn.softmax(tf.matmul(W_hidden,x) + b_hidden)

sess = tf.Session()

with sess.as_default():
    print h.eval()

会给我以下错误:

  ...
    results = self._do_run(target_list, unique_fetch_targets, feed_dict_string)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 419, in _do_run
    e.code)
tensorflow.python.framework.errors.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape dim { size: 2 } dim { size: 1 }
     [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[2,1], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
Caused by op u'Placeholder', defined at:
  File "/home/sfalk/workspace/SemEval2016/java/semeval2016-python/slot1_tf.py", line 8, in <module>
    x  = tf.placeholder("float", [num_input, 1])
  ...

我已经尝试过

tf.assign([tf.Variable(1.0), tf.Variable(1.0)], x)
tf.assign([1.0, 1.0], x)

但是显然那并没有起作用。

1个回答

34

要给一个占位符提供数据,您可以使用 Session.run()(或 Tensor.eval())的feed_dict参数。假设您有以下图表,其中包含一个占位符:

x = tf.placeholder(tf.float32, shape=[2, 2])
y = tf.constant([[1.0, 1.0], [0.0, 1.0]])
z = tf.matmul(x, y)

如果您想评估z,您必须为x提供一个值。您可以按照以下方式执行此操作:

如果您想评估z,您必须为x提供一个值。您可以按照以下方式执行此操作:

sess = tf.Session()
print sess.run(z, feed_dict={x: [[3.0, 4.0], [5.0, 6.0]]})

有关更多信息,请参阅有关提供数据的文档


嗯...难道没有其他办法吗?如果我想查看中间结果的话,这看起来挺不方便的。 - Stefan Falk
你也可以将 feed_dict 参数传递给 Tensor.eval(),这在构建图时可能更方便。如果你想要一个“粘性”占位符,我建议你自己编写一个函数来包装 sess.run(),捕获一组 feed 值,并每次将其传递给 run() 调用。 - mrry
@mrry,你能举个例子来说明你的评论吗?谢谢。 - Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接