踩坑:pytorch中eval模式下結果遠差于train模式介紹
首先,eval模式和train模式得到不同的結果是正常的。我的模型中,eval模式和train模式不同之處在于Batch Normalization和Dropout。Dropout比較簡單,在train時會丟棄一部分連接,在eval時則不會。Batch Normalization,在train時不僅使用了當前batch的均值和方差,也使用了歷史batch統(tǒng)計上的均值和方差,并做一個加權平均(momentum參數(shù))。在test時,由于此時batchsize不一定一致,因此不再使用當前batch的均值和方差,僅使用歷史訓練時的統(tǒng)計值。
我出bug的現(xiàn)象是,train模式下可以收斂,但一旦在測試中切換到了eval模式,結果就很差。如果在測試中仍沿用train模式,反而可以得到不錯的結果。為了確保是程序bug而不是算法本身就不適合于預測,我在測試時再次使用了訓練集,正常情況下此時應發(fā)生過擬合,正確率一定會很高,然而eval模式下正確率仍然很低。參照網(wǎng)上的一些說法(Performance highly degraded when eval() is activated in the test phase
),我調大了batchsize,降低了BN層的momentum,檢查了是否存在不同層使用相同BN層的bug,均不見效。有一種方法說應在BN層設置track_running_stats為False,它雖然帶來了好的效果,但實際上它只不過是不用eval模式,切回train模式罷了,所以也不對。
學習了在訓練過程中,如何將BN層中統(tǒng)計的均值和方差輸出。即在forward()中,
# bn是一個BN層,torch.nn.batch_normalization(...) print(bn.running_mean) print(bn.running_var)
同時學習了如何輸出一個Tensor自身的均值和方差,即
# x是一個Tensor,dims是需要計算的維度 print(x.cpu().detach().numpy().mean(dims) print(x.cpu().detach().numpy().var(dims)
觀察每一層的輸出結果,發(fā)現(xiàn)出現(xiàn)了很大的方差,才猛然意識到自己的輸入數(shù)據(jù)沒有做歸一化(事后想想也確實如此,畢竟模型和訓練方法都是github上參考別人的,出錯概率很?。环炊亲约簩懙腄ataSet部分,其實是最容易出錯的)。給模型加上歸一化后,eval和train的結果就沒有問題了。
再次驗證了我的觀點:越是玄學的問題,越是傻逼的bug。
補充知識:Pytorch中的train和eval用法注意點
1.介紹
一般情況,model.train()是在訓練的時候用到,model.eval()是在測試的時候用到
2.用法
如果模型中沒有類似于BN這樣的歸一化或者Dropout,model.train()和model.eval()可以不要(建議寫一下,比較安全),并且model.train()和model.eval()得到的效果是一樣
如果模型中有類似于BN這樣的歸一化或者Dropout,并且程序需要邊訓練和邊測試,最好就是用model.eval()測試完之后,后面補一個model.train()。
其中model.train()是保證BN用每一批數(shù)據(jù)的均值和方差,而model.eval()是保證BN用全部訓練數(shù)據(jù)的均值和方差;而對于Dropout,model.train()是隨機取一部分網(wǎng)絡連接來訓練更新參數(shù),而model.eval()是利用到了所有網(wǎng)絡連接(結果是取了平均)
以上這篇踩坑:pytorch中eval模式下結果遠差于train模式介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python實現(xiàn)批量識別圖片文字并存為Excel
批量文字識別是Python辦公自動化的基本操作,應用在我們工作生活中的方方面面。本文主要以開源免費的easyocr來實現(xiàn)批量識別圖片文字并存為Excel,感興趣的可以學習一下2022-06-06Tensorflow實現(xiàn)部分參數(shù)梯度更新操作
今天小編就為大家分享一篇Tensorflow實現(xiàn)部分參數(shù)梯度更新操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python Json數(shù)據(jù)文件操作原理解析
這篇文章主要介紹了Python Json數(shù)據(jù)文件操作原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05如何使用PyCharm將代碼上傳到GitHub上(圖文詳解)
這篇文章主要介紹了如何使用PyCharm將代碼上傳到GitHub上(圖文詳解),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04