2017-01-19 12 views
0

CNNネットワークを適用すると、tf.equal()関数がうまくいくように見えます。下記の場合、tf.equal()は誤った結果を返します。コードでなぜtensorflow equalが不正確な結果をもたらすのか

with tf.Graph().as_default(): 

      images, labels = inputs("./test_data", [64, 64], 10, True) 

      logits = inference(images, 2, 1.0) 

      acc = accuracy(logits, labels) 

      saver = tf.train.Saver() 

      #predict_image(saver, logits) 

      eval_once(saver, logits, acc, labels) 



def eval_once(saver, logits, acc, labels): 
    with tf.Session() as sess: 
      ckpt = tf.train.get_checkpoint_state("./model/") 
      if ckpt and ckpt.model_checkpoint_path: 
        saver.restore(sess, ckpt.model_checkpoint_path) 
        print "Model Loaded!" 
      else: 
        print "Model Not Found!" 
        return 

      coord = tf.train.Coordinator() 

      threads = tf.train.start_queue_runners(sess, coord = coord) 

      l = tf.argmax(labels,1) 
      p = tf.argmax(logits,1) 

      print "labels" 
      print sess.run(l) 

      print "preds" 
      print sess.run(p) 

      print sess.run(tf.equal(l, p)) 

      print "%.5f" % sess.run(acc) 

      coord.request_stop() 

      coord.join(threads, stop_grace_period_secs = 10) 

、入力がfile_queueて画像を読んでいましたし、inferenceは、私たちのCNNネットワークを定義します。 inferenceの出力は最後に完全に接続されたレイヤーのログです。私の場合、ラベルはone_hotでエンコードされ、2つのクラスがあるので、[1,0]または[0,1]にする必要があります。

結果は以下の通りです:

labels 
[0 0 1 0 1 0 0 0 1 0] 
preds 
[0 1 0 1 0 0 1 0 1 1] 
[ True True True True True True True True True True] 
0.90000 

我々は(インデックス0から開始)ラベルとpredsがインデックス1に等しくないことを知ることから。ただし、tf.equal()Trueとなります。インデックス2とインデックス3と同じです。

次に、私はtf.equal()をテストし、結果は正しいです。

どうしたらできますか?

(私は画像を読み、トレーニングとテストのためのバッチを作成するためにtf.train.batchまたはtf.train.shuffleを適用するためにfile_queueを使用していました。ただ、tensorflow例でcifar 10の例のように)

+0

'l_val、p_val、eq_val、acc_val = sess.run([l、p、tf.equal(l、p)、acc])'のようなものを使って、同じ呼び出しですべてのテンソルを評価し、結果がまだ間違っている – jdehesa

+0

ありがとう 'jdehesa'。それが問題だ。 –

答えて

1

思考の後、一つの可能​​性があります私がsess.run()と呼ぶたびに、file_queueはシャッフルされた画像とラベルを読んで結果が害になることを覚えています。

関連する問題