在上一篇文章中,我使用session运行了一个预先定义好的tensor,假如我想使用一个空的tensor呢?这就需要用到tf.placeholder() 和 feed_dict 。
tf.placeholder()
在TensorFlow(后文简称TF)中,数据并不会保存为 integer, float, 或 string. 这些值都封装在 tensor 对象中,因此不能直接定义并使用一个变量例如x,因为你设计的模型可能需要受不同的数据集与不同的参数。所以TF使用placeholder()来传递一个tensor到session.run()中。
Session’s feed_dict
x = tf.placeholder(tf.string)
with tf.Session() as sess:
output = sess.run(x, feed_dict={x: 'Hello World'})
如上面这段代码所示,在tf.Session.run()中使用feed_dict来传入tensor.上面这个例子传入的是一个字符串”Hello, world”,feed_dict也可以同时传入多个tensor,如下所示。
x = tf.placeholder(tf.string)
y = tf.placeholder(tf.int32)
z = tf.placeholder(tf.float32)
with tf.Session() as sess:
output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67})
注意:你应该已经注意到所有tensor都已经被预先定义类型,如果在feed_dict中传入的类型与预先定义的不符合,则TF会报“ValueError: invalid literal for…”错误。
一个思考:
那么,什么时候该用tf.placeholder,什么时候该使用tf.Variable之类直接定义参数呢?
答案是,tf.Variable适合一些需要初始化或被训练而变化的权重或参数,而tf.placeholder适合通常不会改变的被训练的数据集。
参考:What’s the difference between tf.placeholder and tf.Variable