文章目錄
- 1. model.eval()
- 2. model.train()
兩者只在一定的情況下有區別:訓練的模型中含有dropout 和 batch normalization
1. model.eval()
在模型測試階段使用
pytorch會自動把BN和DropOut固定住,不會取每個batchsize的平均,而是用訓練好的值。
不然的話,有輸入數據,即使不訓練,它也會改變權值。
一旦test的batch_size過小,很容易就會被BN層導致生成圖片顏色失真極大;
測試模型的時候
一般model.eval() 和 with torch.no_grad() 一起使用。
model.eval()with torch.no_grad():...out_data = model(data)...
model.train() #最后別忘記加上
2. model.train()
讓model變成訓練模式,此時 dropout和batch normalization的操作在訓練q起到防止網絡過擬合的問題
總結: model.train() 和 model.eval() 一般在模型訓練和評價的時候會加上這兩句,主要是針對由于model 在訓練時和評價時 Batch Normalization 和 Dropout 方法模式不同;
因此,在使用PyTorch進行訓練和測試時一定注意要把實例化的model指定train/eval;
在訓練的時候, 會計算一個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的作用是不同的。
https://blog.csdn.net/qq_32678471/article/details/102892930