Tensorflow:我什么时候应该使用或不使用`feed_dict`?

use*_*184 9 tensorflow

我有点困惑,为什么要使用feed_dict?根据我的朋友说,您通常在使用feed_dict时使用placeholder,这可能对生产不利。

我看过这样的代码,其中feed_dict没有涉及:

for j in range(n_batches):
    X_batch, Y_batch = mnist.train.next_batch(batch_size)
    _, loss_batch = sess.run([optimizer, loss], {X: X_batch, Y:Y_batch}) 
Run Code Online (Sandbox Code Playgroud)

我也看到过这样的代码,其中feed_dict涉及到:

for i in range(100): 
    for x, y in data:
        # Session execute optimizer and fetch values of loss
        _, l = sess.run([optimizer, loss], feed_dict={X: x, Y:y}) 
        total_loss += l
Run Code Online (Sandbox Code Playgroud)

我知道feed_dict您正在输入数据,并X像在字典中一样尝试作为键。但是在这里我看不到任何区别。那么,到底有什么区别feed_dict?为什么需要?

Dav*_*rks 14

在tensorflow模型中,您可以定义一个占位符,例如x = tf.placeholder(tf.float32),然后将x在模型中使用。

例如,我将一组简单的操作定义为:

x = tf.placeholder(tf.float32)
y = x * 42
Run Code Online (Sandbox Code Playgroud)

现在,当我要求tensorflow进行计算时y,很明显这y取决于x

with tf.Session() as sess:
  sess.run(y)
Run Code Online (Sandbox Code Playgroud)

这将产生一个错误,因为我没有给它赋值x。在这种情况下,因为x是占位符,所以如果将其用于计算中,则必须将其传递给via feed_dict。如果不这样做,那就是错误。

让我们修复一下:

with tf.Session() as sess:
  sess.run(y, feed_dict={x: 2})
Run Code Online (Sandbox Code Playgroud)

这次的结果将是84。大。现在让我们看一个feed_dict不需要的琐碎情况:

x = tf.constant(2)
y = x * 42
Run Code Online (Sandbox Code Playgroud)

现在没有占位符(x是一个常量),因此不需要向模型提供任何东西。现在可以使用:

with tf.Session() as sess:
  sess.run(y)
Run Code Online (Sandbox Code Playgroud)