2017-06-06 199 views
2

通常我使用的訓練我的網絡tf.session.run(),並使用eval()用於獲取測試的準確性或損失。但我看到人們也使用session.run()來獲取測試結果,這對我來說很奇怪。我認爲tf.session.run()僅用於培訓,而不是測試。如何使用tf.session.run()進行測試(不更新網絡參數)?

是否有下tf.session.run(),我不知道有什麼祕密嗎?

非常感謝!

回答

3

tf.session.run()是爲了運行一個或幾個TF操作,或評估TF張量,甚至可能混合這兩種類別。

當叫上張量,它基本上會評估它就像eval()。您可以使用它來進行培訓,sess.run(train_op, feed_dict=train_data)將更新您的變量值,因爲這是train_op的作用。但是,如果你調用sess.run(accuracy, feed_dict=data),它將評估accuracy張量的值,當輸入值是那些由data給予,無論這是否是訓練,驗證或測試數據,並不會改變變量的值,因爲你」只是評估一個張量,而不是運行一個改變變量值的操作。

所以tf.session.run()比你認爲確實要廣泛得多,它即使在測試運行時間推斷或評價你的表現,通常的方式!

你甚至可以做多件事情同時,避免了多次做直傳相同的輸入:

_, loss_value, accuracy_value = sess.run([train_op, loss_tensor, accuracy_tensor], feed_dict=data) 
print('Loss value: %f' % loss_value) 
+0

非常感謝您@gdelab!所以這個函數實際上只是我們在train_op中需要的嗎? –

+0

我不知道我理解你的問題。如果你調用'sess.run(train_op,feed_dict = train_data)',它會運行'train_op'一次,只做那個,是的。 (如果你有一個巨大的圖形,但'train_op'只使用並影響其中的一小部分,只有這個小部分將運行)。同樣,如果你調用'acc_value = sess.run(accuracy,feed_dict = data)',它將不會運行'train_op',因爲它不需要'精度',所以它不會改變變量的權重。 – gdelab

+0

是的,我現在明白了。謝謝!你的解釋很清楚! –

相關問題