当我阅读TensorFlow代码时,我看到人们为函数的输入参数指定占位符,然后在session.run
中提供输入数据。一个简单的例子可以是:
def sigmoid(z):
x = tf.placeholder(tf.float32, name='x')
sigmoid = tf.sigmoid(x)
with tf.Session() as session:
result = session.run(sigmoid, feed_dict={x:z})
return result
我想知道为什么他们不直接将z
提供给tf.sigmoid(z)
并删除占位符x
?
如果这是最佳做法,背后的原因是什么?
答案 0 :(得分:2)
在您的示例方法sigmoid
中,您基本上构建了一个小型计算图(见下文),并使用session.run
(使用相同的方法)运行它。是的,在您的情况下使用占位符不会增加任何好处。
然而,通常人们只是构建了计算图(并在以后用数据执行图)。但在构建图形时,不需要数据。这就是为什么我们使用占位符来保存数据的原因。或者换句话说,它允许我们在不需要任何数据的情况下创建我们的计算操作。
另外this应解释为什么我们要使用tf.placehoder
代替tf.Variable
来保存培训数据。简而言之:
tf.Variable
适用于模型的可训练参数。tf.placeholder
用于训练数据,这些数据不会作为模型训练而改变。None
,从而支持任何batch_size。