为什么使用不同类型的会话会影响变量是否在tensorflow中初始化?

时间:2017-06-04 23:16:06

标签: python session tensorflow

我正在尝试在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而不是该培训步骤中损失函数的实际值?我想观察迭代过程中损失函数的变化。

1 个答案:

答案 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}))

注意,因为我无法测试您的代码,因此可能会出现一些错误,如果您愿意,请发表评论。