我正在尝试在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
而不是该培训步骤中损失函数的实际值?我想观察迭代过程中损失函数的变化。答案 0 :(得分:1)
在会话中初始化变量的正确方法如下:
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}))
注意,因为我无法测试您的代码,因此可能会出现一些错误,如果您愿意,请发表评论。