關於tensorflow 2.0 中訓練時的相關事項

在使用cifar10 訓練中,對比修改某些參數對訓練結果的影響html

1 框架的修改的基本邏輯

1.1 訓練的背景

1) 訓練環境:python 3.6 + tensorflow 2.0 python

2)訓練數據:cifar10框架

3)訓練數據分類:train 32000 + val 8000 + test 10000iphone

1.2 改變的邏輯

如下邏輯只是自我感受,沒有找到相關論文,下降 loss 方向又不知道怎麼修改,朝那個方向修改更好,只得慢慢調整,積累一些規律,固然了,這些規律在之後的實踐中有多是「階段性正確」。函數

關於訓練前那些暫不修改事項post

1) - 在學習優化器時,看好多視頻資料、文檔資料、博文等對 adam 優化器評價較高,或者基於 adam 的改良版 RAdam 。學習

好比在 「 Adam優化器如何選擇 」一文中講述的很是不錯。能夠參考。測試

關於改良版:要獲得最強的優化器,只須要把RAdam和LookAhead合二爲一優化

不是咱們喜新厭舊,而是RAdam確實是好用,新的State of the Art優化器RAdamurl

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )

 

2) - 選擇激活函數的選擇,在此選擇relu,由於這是公認的好激活函數,或者採用它的升級版 LeakyReLU 。

在tensorflow 2.0 中使用 relu 和 LeakyReLU 介紹了使用方法。可是沒有更多的理論介紹(理論的內容網上堆成山)。

3) - 選用 100 個 epoch + 自動終止,實驗證實,通常不到100個epoch就會自動終止。

4) - 相對上面不動的內容,下面改變其餘內容。

2 relu vs LeakyReLU

2.1 結果數據化

名稱 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

2.2 結果可視化

 

 

 2.3 模型可視化

 

 

 2.4 替換代碼段

# 第一層卷積
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))

3 batch_size 大小

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] )

3.1 batch_size = 16 / 64 / 256

爲了使訓練樣本對比更加有效,每一個 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 

3.2 每組訓練詳記

組別 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

相關文章
相關標籤/搜索