2017-06-04 54 views
1

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

的正確方法初始化變量,像下面這樣的會議:

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

相關問題