0

我正在訓練卷積神經網絡(CNN)和我遇到的MNIST在訓練和驗證準確性顯著下跌X迭代後: Steps vs. accuracy培訓和驗證準確度突然下降卷積神經網絡(CNN)

是X似乎取決於學習速度。修改輟學似乎沒有對這種現象有任何影響。我用較低的報告做了測試(每100個批次報告一次),並注意到下降速度非常快。降落後精度不會恢復。

training_accuracy/validation_accuracy => 1.0000/1.0000 for step 10000 
training_accuracy/validation_accuracy => 0.9833/1.0000 for step 20000 
training_accuracy/validation_accuracy => 1.0000/1.0000 for step 30000 
training_accuracy/validation_accuracy => 1.0000/1.0000 for step 40000 
training_accuracy/validation_accuracy => 1.0000/1.0000 for step 50000 
training_accuracy/validation_accuracy => 0.1000/0.1000 for step 60000 
training_accuracy/validation_accuracy => 0.1000/0.1000 for step 69999 

我的CNN是典型的CNN,從0開始訓練。代碼可用here。數據集是標準MNIST數據集,有兩個卡口:

  • 我隨機噪聲添加到圖像以非常低的值
  • 我隨意移動影像留下幾個像素,右

那不是過學習,因爲訓練準確度也會下降。

我注意到所有的預測都是0之後的下降。所以準確度是1/10 = 0.1(因爲CNN預測總是爲0)

你知道那是什麼現象嗎?我感謝你的想法和反饋。

更新1: 我注意到,所有的TF重量和偏見都充滿了楠:

2017-06-10 13:06:34.814975: I tensorflow/core/kernels/logging_ops.cc:79] This is W_fc1: [[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan]...] 2017-06-10 13:06:34.830064: I tensorflow/core/kernels/logging_ops.cc:79] This is b_fc1: [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan...] 2017-06-10 13:06:34.840501: I tensorflow/core/kernels/logging_ops.cc:79] This is W_fc2: [[nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan]...] 2017-06-10 13:06:34.851325: I tensorflow/core/kernels/logging_ops.cc:79] This is b_fc2: [nan nan nan nan nan nan nan nan nan nan]

+0

NaNs意味着損失爆炸,你的學習速度可能太高。 –

+0

我不認爲這個損失爆炸。它慢慢地變爲0.或者我誤解了你? – Tigran

+0

我添加了常量來記錄函數,可能會幫助:'tf.log(y + small_constant)'。 – Tigran

回答

2

如果您使用的是交叉熵損失函數,那麼一旦你的網絡輸出0.0的預測則你的損失包含日誌(0),這是nan。在Python中,對nan執行的任何操作也是nan,所以這個nan很快就會反向傳播到整個網絡。在將output傳遞給損失函數之前,使用output = tf.clip_by_value(output, 10e-8, 1.-10e-8)。您使用tf.log(y + small_constant)的解決方案也可以使用。