在使用cifar10 訓練中,對比修改某些參數對訓練結果的影響html
1) 訓練環境:python 3.6 + tensorflow 2.0 python
2)訓練數據:cifar10框架
3)訓練數據分類:train 32000 + val 8000 + test 10000iphone
如下邏輯只是自我感受,沒有找到相關論文,下降 loss 方向又不知道怎麼修改,朝那個方向修改更好,只得慢慢調整,積累一些規律,固然了,這些規律在之後的實踐中有多是「階段性正確」。函數
關於訓練前那些暫不修改事項post
1) - 在學習優化器時,看好多視頻資料、文檔資料、博文等對 adam 優化器評價較高,或者基於 adam 的改良版 RAdam 。學習
好比在 「 Adam優化器如何選擇 」一文中講述的很是不錯。能夠參考。測試
關於改良版:要獲得最強的優化器,只須要把RAdam和LookAhead合二爲一優化
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )
2) - 選擇激活函數的選擇,在此選擇relu,由於這是公認的好激活函數,或者採用它的升級版 LeakyReLU 。
在tensorflow 2.0 中使用 relu 和 LeakyReLU 介紹了使用方法。可是沒有更多的理論介紹(理論的內容網上堆成山)。
3) - 選用 100 個 epoch + 自動終止,實驗證實,通常不到100個epoch就會自動終止。
4) - 相對上面不動的內容,下面改變其餘內容。
名稱 | relu | LeakyReLU | 備註 | |
epoch | 18 | 17 | 差異不大 | |
train_set |
loss | 0.3005 | 0.1893♠ | LeakyReLU好 |
accuracy | 0.8917 | 0.9336♠ | LeakyReLU好 | |
val_set |
val_loss | 1.3521♠ | 1.5921 | relu較好 |
val_accuracy | 0.6705♠ | 0.6759 | 差異不大 | |
test_set | test_loss | 1.3466♠ | 1.6643 | relu較好 |
test_acc | 0.6723♠ | 0.6634 | 差異不大 |
結論:
1 - LeakyReLU 較好,能夠使用 LeakyReLU 做爲激活函數 。
2 - 對數據進行加強處理,以下降可能出現的過擬合現象
3 - 缺了一項?時間忘了添加進去。
保存名稱(便於後續查詢使用)
relu:model_point2019.10.14.23.23.56.h5
LeakyReLU:model_point2019.10.14.22.47.40.h5
# 第一層卷積 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) # model.add(layers.Conv2D(32, (3, 3), input_shape=(32, 32, 3))) # model.add(layers.LeakyReLU(0.01))
feed 給模型的 batch_size 大小不同,其結果也存在有差別
history = model.fit(train_images, train_labels, epochs=100, batch_size=256, validation_data=(val_images, val_labels), callbacks=[visualization.model_point, visualization.model_stop] )
爲了使訓練樣本對比更加有效,每一個 batch_size 分爲 3 次,取中間值。
具體以下:
組別 | 16 | 64 | 256 | PK | |
細目 | 16-C | 64-C | 256-B | batch_size增長 | |
epoch | 14 | 18 | 30 | 增 | |
train_set |
loss | 0.2387 | 0.2442 | 0.3747 | 增 |
accuracy | 0.9154 | 0.9144 | 0.8707 | 降 | |
val_set |
val_loss | 1.5866 | 1.3429 | 1.0724 | 降 |
val_accuracy | 0.6536 | 0.6811 | 0.6858 | 增 | |
時間 | 10s310us | 4s111us | 2s69us | 降(倍數關係) | |
test_set | test_loss | 1.6349 | 1.3562 | 1.0770 | 降 |
test_acc | 0.6554 | 0.6820 | 0.6804 | 增 | |
時間 | 12s 1ms | 3s 324us | 3s 323us | 降 |
從上面能夠得出,batch_size 的增長使得訓練數據集的損失增長而準確度下降,同時儘管驗證集中的損失值下降較多,可是準確度僅僅微微增長,因此小的 batch_size 更有利於模型的訓練。
對於測試集而言,其效果與驗證集相似。
固然了這僅僅針對目前的環境,是否是會隨着數據集數量的變化而變化,暫時尚不知。
如今有些明白爲何好多模型的訓練採用小的 batch_size了。之後的訓練能夠嘗試 16 或者 32
組別 | batch_size=16 | ||||
細目 | 16-A | 16-B | 16-C | 均值 | |
epoch | 16 | 13 | 14 | 14.3 | |
train_set |
loss | 0.1854 | 0.2348 | 0.2387 | 0.2196 |
accuracy | 0.9345 | 0.9160 | 0.9154 | 0.9345 | |
val_set |
val_loss | 1.8339 | 1.6358 | 1.5866 | 1.7103 |
val_accuracy | 0.6587 | 0.6697 | 0.6536 | 0.6607 | |
時間 | 9s291us | 10s306us | 10s310us | ||
test_set | test_loss | ||||
test_acc | |||||
時間 |
組別 | batch_size = 64 | ||||
細目 | 64-A | 64-B | 64-C | 均值 | |
epoch | 18 | 17 | 18 | 18 |
|
train_set |
loss | 0.2361 | 0.2834 | 0.2442 | 0.2546 |
accuracy | 0.9161 | 0.9008 | 0.9144 | 0.9104 | |
val_set |
val_loss | 1.3731 | 1.2901 | 1.3429 | 1.3165 |
val_accuracy | 0.6754 | 0.6798 | 0.6811 | 0.6788 | |
時間 | 4s114us | 4s109us | 4s111us | ||
test_set | test_loss | ||||
test_acc | |||||
時間 |
組別 | batch_size = 256 | ||||
細目 | 256-A | 256-B | 256-C | 均值 | |
epoch | 29 | 30 | 28 | 29 |
|
train_set |
loss | 0.3541 | 0.3747 | 0.4420 | 0.3903 |
accuracy | 0.8776 | 0.8707 | 0.8467 | 0.8650 | |
val_set |
val_loss | 1.0990 | 1.0724 | 0.9405 | 1.0373 |
val_accuracy | 0.6874 | 0.6858 | 0.7064 | 0.6932 | |
時間 | 2s70us | 2s69us | 2s68us | ||
test_set | test_loss | ||||
test_acc | |||||
時間 |
保存模型備註:
16-A model_point2019.10.15.00.18.11.h5
16-B model_point2019.10.15.00.22.22.h5
16-C model_point2019.10.15.00.30.50.h5
64-A model_point2019.10.15.00.35.56.h5
64-B model_point2019.10.15.00.38.41.h5
64-C model_point2019.10.15.00.41.05.h5
256-A model_point2019.10.15.00.45.30.h5
256-B model_point2019.10.15.00.49.30.h5
256-C model_point2019.10.15.00.52.47.h5