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の例のように)
'l_val、p_val、eq_val、acc_val = sess.run([l、p、tf.equal(l、p)、acc])'のようなものを使って、同じ呼び出しですべてのテンソルを評価し、結果がまだ間違っている – jdehesa
ありがとう 'jdehesa'。それが問題だ。 –