我是Tensorflow的新手,我正在尝试理解什么时候需要使用feed_dict,以及什么时候不需要使用它。
然而,我对feed_dict的工作方式感到困惑。
例如:1、2和3的结果是否相同?
1. accuracy, cost = sess.run([accuracy, cost], feed_dict = {X:X_batch, Y:Y_batch})2. accuracy = sess.run(accuracy, feed_dict = {X:X_batch, Y: Y_batch}) cost = sess.run(cost, feed_dict = {X:X_batch, Y:Y_batch})3. accuracy = sess.run(accuracy, feed_dict = {X:X_batch, Y:Y_batch}) cost = sess.run(cost)
我不知道如果Tensorflow在计算准确率时已经计算了成本,并且接收到相同的feed_dict,那么它是否会再次通过神经网络来评估这个值,或者它会直接返回已经计算好的值而不再次通过网络?
另外,既然成本已经在图中计算过了,如果我想获取最新计算的成本,我可以像方法3那样做吗?
此外,来自Hvass-Labs/TensorFlow-Tutorials/TensorFlow教程#02卷积神经网络,
在函数plot_conv_weights(weights, input_channel=0)中
weights = sess.run(conv_weigh)
由于训练权重需要我们为占位符X和Y填充值,但在这里我没有看到feed_dict。
那么feed_dict到底是如何工作的?
附注:我在tensorflow的GitHub上问了这个问题,但他们关闭了我的问题,并向我展示了tf.Session().run()的工作方式。
从文档中我了解到,如果获取tf.Operation,它会返回None。tf.Operation是TensorFlow图中的节点,用于对两个张量进行计算。
然而,我认为这个文档与我的问题无关…
回答:
要理解feed_dict
,你需要了解TensorFlow的工作原理。在TF中,一切都是惰性评估的。
这里有一个简单的例子:
import tensorflow as tfa = tf.placeholder(tf.float32)b = tf.placeholder(tf.float32)c = tf.add(a, b)sess = tf.Session()print(sess.run(c, feed_dict={a: 1, b: 2}))sess.close()
从代码中可以看到,我们有两个没有填充任何数字的占位符。我们的目标是计算a
和b
的和。通过feed_dict
,我们基本上是在为它们填充值。这个概念也适用于你的问题。
关于你的问题,这是否相同:
1. accuracy, cost = sess.run([accuracy, cost], feed_dict = {X:X_batch, Y:Y_batch})2. accuracy = sess.run(accuracy, feed_dict = {X:X_batch, Y: Y_batch}) cost = sess.run(cost, feed_dict = {X:X_batch, Y:Y_batch})
答案是肯定的。TensorFlow的另一个概念是计算与图是分离的,这意味着只要你的计算在同一个session
中运行,你将为accuracy
和cost
得到相同的结果。但当然,我们总是更喜欢1)。
关于你最后一个问题,关于权重函数。在他的笔记本中,你可以看到没有涉及计算:
# 从TensorFlow中获取权重变量的值。# 不需要feed-dict,因为没有计算。w = session.run(weights)
他只是在绘制由optimize
函数产生的权重输出。