2017-06-04 7 views
1

MNISTデータセットで分類子を実行しようとしています。私はこれを正しく行うためにセッションを初期化する必要があることを知っています。なぜ異なるタイプのセッションを使用すると、変数がテンソルフローで初期化されるかどうかに影響しますか?

しかし、ニューラルネットワークでトレーニング反復を実行しているときに、値をプリントアウトすることができます。

このように、これらの変数の値を印刷するには、print(sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}))行を印刷します。

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

私はこの約2つの関連の問題を持っている:あなたはtensorflowがインストールされている場合は次のコードが実行可能です。ラインが上記である私は、私はあなたが見ることができる(sess = tf.InteractiveSession()を使用Session()の代わりに使用してこれを実行しようとすると、その後

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)]] 

:私はsess = tf.Session()を使用して、私のセッションを初期化することによって、これを実行しようとする問題は、私はFailedPredictionErrorを取得していますそれ)。私がそれをするとき、それは動作しますが、それは損失関数の実際の値の代わりに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()を使用すると、グローバル変数の初期化子がセッションにバインドされていないため、質問のコードが破損します。これがあなたの最初の質問です。


2番目の質問は、テンソルフローがどのように機能するのかよく分かりません。 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

私はやったと思う?申し訳ありません...私はこれにnewtoです – nundo

関連する問題