2015-11-20 26 views
21

私はTensorFlow "MNIST For ML Beginners"チュートリアルを見ています。トレーニングのたびにトレーニングの損失をプリントアウトしたいと思います。TensorFlowトレーニング中の損失の印刷

マイトレーニングループは現在、次のようになります。

cross_entropy私はプリントアウトしたい損失である
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 

cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

さて、train_stepは次のように定義され

これを印刷する方法の1つは、明示的にトレーニングループで:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    print 'loss = ' + str(cross_entropy) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

私は今、このに関する二つの質問があります:cross_entropyはすでにsess.run(train_step, ...)間に計算されていることを考えると

  1. を、二倍の数を必要とし、それを2回計算するために非効率ですすべてのトレーニングデータの順方向パス。 sess.run(train_step, ...)の間に計算されたときにcross_entropyの値にアクセスする方法はありますか?

  2. tf.Variableを印刷するにはどうすればよいですか? str(cross_entropy)を使用するとエラーが発生します...

ありがとう!

答えて

32

cross_entropyの値をsess.run(...)の引数リストに追加することで取得できます。たとえば、次のようにあなたのfor -loopを書き換えることができます

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    _, loss_val = sess.run([train_step, cross_entropy], 
          feed_dict={x: batch_xs, y_: batch_ys}) 
    print 'loss = ' + loss_val 

同じアプローチは、変数の現在の値を印刷するために使用することができます。あなたが次のことを行うことができ、cross_entropyの値に加えて、あなたはWと呼ばれるtf.Variableの値を印刷したかった、のは、言ってみましょう:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    _, loss_val, W_val = sess.run([train_step, cross_entropy, W], 
            feed_dict={x: batch_xs, y_: batch_ys}) 
    print 'loss = %s' % loss_val 
    print 'W = %s' % W_val 
+3

感謝。だから私は 'sess.run([train_step、cross_entropy])'を呼び出すたびに 'cross_entropy'を1回だけ計算します。私が渡す変数のそれぞれに対して追加のフォワードパスはありませんか? – Karnivaurus

+2

これは正しいことです。( 'cross_entropy'はすでにトレーニングステップの一部として計算されているので)完全に同じサブグラフを実行し、' cross_entropy'の値をPythonプログラムにフェッチする余分なノードを追加するだけです。 – mrry

+0

ありがとうございます。サイドポイントとして、提案したように自分のコードを更新した後、 'cross_entropy'の値は平均してループ全体で減少します。しかし、実際には、トレーニングの反復から次のトレーニングの反復にかけて増加することがあります。これは、勾配降下のステップサイズの範囲で起こります。これは期待されていますか?あなたはこの損失を減らすべき方向に体重を動かしているので、各反復後に損失は常に減少しないでしょうか?損失対反復のグラフはここにあります:http://i.stack.imgur.com/f8B80.png – Karnivaurus

3

training_stepを実行するだけでなく、cross_entropyノードを実行して値を返します。それを忘れないでください:あなたがこれを行うことができますので

var_as_a_python_value = sess.run(tensorflow_variable) 

は、何をしたいあなたを与える:トレーニングを実行し、それが中に計算されたように、クロスエントロピーの値を引き出すの両方に

[_, cross_entropy_py] = sess.run([train_step, cross_entropy], 
           feed_dict={x: batch_xs, y_: batch_ys}) 

を繰り返し。 sess.runの引数と戻り値を両方ともリストにすることで、両方が実行されることに注意してください。

関連する問題