Pytorch model.train 與 model.eval的區別(我是搬運工)

參考文章1知乎
參考文章2博客
參考文章3博客
參考文章4博客
model.eval(),Pytorch會自動把BN和Dropout固定住,不會取平均,而是用訓練好的值。不然的話,一旦test的batch_size過小,很容易就會被BN層導致生成圖片顏色失真極大;在模型測試階段使用model.train() 讓model變成訓練模式,此時 dropout和batch normalization的操作在訓練q起到防止網絡過擬合的問題。

同時發現,如果不寫這兩個程序也可以運行,這是因爲這兩個方法是針對在網絡訓練和測試時採用不同方式的情況,比如Batch Normalization 和 Dropout。

  • 訓練時是正對每個min-batch的,但是在測試中往往是針對單張圖片,即不存在min-batch的概念。由於網絡訓練完畢後參數都是固定的,因此每個批次的均值和方差都是不變的,因此直接結算所有batch的均值和方差。所有Batch Normalization的訓練和測試時的操作不同。
  • 在訓練中,每個隱層的神經元先乘概率P,然後在進行激活,在測試中,所有的神經元先進行激活,然後每個隱層神經元的輸出乘P。

以下解釋更易理解:
在訓練的時候, 會計算一個batch內的mean 和var, 但是因爲是小batch小batch的訓練的,所以會採用加權或者動量的形式來將每個batch的 mean和var來累加起來,也就是說再算當前的batch的時候,其實當前的權重只是佔了0.1, 之前所有訓練過的佔了0.9的權重,這樣做的好處是不至於因爲某一個batch太過奇葩而導致的訓練不穩定。
好,現在假設訓練完成了, 那麼在整個訓練集上面也得到了一個最終的”mean 和var”, BN層裏面的參數也學習完了(如果指定學習的話),而現在需要測試了,測試的時候往往會一張圖一張圖的去測,這時候沒有batch而言了,對單獨一個數據做 mean和var是沒有意義的, 那麼怎麼辦,實際上在測試的時候BN裏面用的mean和var就是訓練結束後的mean_final 和 val_final. 也可說是在測試的時候BN就是一個變換。所以在用pytorch的時候要注意這一點,在訓練之前要有model.train() 來告訴網絡現在開啓了訓練模式,在eval的時候要用”model.eval()”, 用來告訴網絡現在要進入測試模式了.因爲這兩種模式下BN的作用是不同的。

總結: model.train() 和 model.eval() 一般在模型訓練和評價的時候會加上這兩句,主要是針對由於model 在訓練時和評價時 Batch Normalization 和 Dropout 方法模式不同;因此,在使用PyTorch進行訓練和測試時一定注意要把實例化的model指定train/eval。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章