为什么使用不同类型的会话会影响变量是否在张量流中初始化?
我想在MNIST数据集上运行分类器。我知道我需要初始化会话才能正确执行此操作。为什么使用不同类型的会话会影响变量是否在张量流中初始化?
但是,我想要做的另一件事是当我在神经网络上运行训练迭代时打印出值。
因此,我尝试打印出行print(sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}))
以打印出这些变量的值。下面的代码是可运行的,如果你有安装tensorflow
:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse
import sys
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
data_dir='/tmp/tensorflow/mnist/input_data'
mnist = input_data.read_data_sets(data_dir, one_hot=True)
# Create the model
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
# sess = tf.InteractiveSession()
sess = tf.Session()
tf.global_variables_initializer().run()
# Train
for k in range(1000):
# print loss function at each iteration
if k%100 == 0 and k!=0:
print(sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}))
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
我对此有两个相关的问题。问题是,当我尝试使用sess = tf.Session()
初始化我会话运行此我得到一个FailedPredictionError
:
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable_14
[[Node: Variable_14/read = Identity[T=DT_FLOAT, _class=["loc:@Variable_14"], _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_14)]]
然后,我尝试做到这一点使用的Session()
,而不是我用sess = tf.InteractiveSession()
(你可以看到的是上面的行它)。当我这样做时,它可以正常工作,但它正在打印None
而不是损失函数的实际值。
我的两个问题是:
- 为什么的
Session
我使用的影响变量是否被初始化的类型? - 为什么印刷线
print(sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
打印None
而不是该训练步骤中损失函数的实际值?我想观察迭代中的损失函数的变化。
的正确方法初始化变量,像下面这样的会议:
sess = tf.Session()
sess.run(tf.global_variables_initializer()) # or tf.global_variables_initializer().run(sess = sess)
#or
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
你可能不知道有什么区别。
因为当您使用tf.InteractiveSession()
创建会话时,此InteractiveSession
会将其本身安装为构建时的默认会话。这意味着您可以直接拨打operation.run()
以在此会话中运行此操作。
但是,如果您使用tf.Session()
,则需要明确指出在运行某个操作时使用哪个会话。所以如果你使用tf.Session()
,你的问题中的代码被破坏,因为全局变量初始值设定项没有与你的会话绑定。这是你的第一个问题。
第二个问题是因为你对张量流的工作原理不了解。 sess.run()
的结果只是返回操作返回的结果。并且操作.minimize()
不会返回您所期望的。如果你想获得的损失,代码应该像下面这样:
if k%100 == 0 and k!=0:
print(sess.run(cross_entropy, feed_dict={x: batch_xs, y_: batch_ys}))
注意,因为我不能测试你的代码,所以有可能会出现一些错误,如果你想发表评论我。
我的声望不会让我投票,但谢谢。 – nundo
@nundo你可以接受我的回答。 – Sraw
我想我做过?对不起...我是新来的 – nundo