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

问题描述:

我想在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})) 

注意,因为我不能测试你的代码,所以有可能会出现一些错误,如果你想发表评论我。

+0

我的声望不会让我投票,但谢谢。 – nundo

+0

@nundo你可以接受我的回答。 – Sraw

+0

我想我做过?对不起...我是新来的 – nundo