我的模型訓練好了之後,保存下來重新載入權重進行預測,準確率會下降幾個點,在訓練集上的表現也是如此,這是為什麼呢? 請大佬們指點。

我剛剛訓練好了一個模型,訓練時訓練集上的表現是99,然後保存下來重新載入再訓練集上的表現卻是77,這很奇怪,隨後我將模型載入繼續訓練一個epoch,訓練時訓練集仍是99,說明模型沒有問題呀,為啥會出現這樣子的差異呢?


檢查下是不是模型沒有設置model.eval()

再檢查下什麼情況下保存的權重。有可能模型不是在最優點保存的。


有沒有確定把模型調為測試模式呢?( model.eval() )


你兩種測試準確率的方法一致嗎


有可能是因為在網路中使用了 bn,bn 在更新的時候有一個 running_mean 和 running_var 表示該層的 均值和方差,在訓練過程中的更新方式為在官方文檔中是如下形式:

也就是

new running_mean = (1 - momentum) x old running_mean + momentum x 本次計算出來的 mean。

可以嘗試在訓練時設置 bn 函數的 momentum 參數大一些如 0.5,或者適當增加一些訓練步數讓bn曾的參數收斂。

參考資料

BatchNorm2d - PyTorch 1.7.0 documentation


訓練時99,保存後載入是77,這是差了22個點嗎?

載入後再訓練一個epoch是99,那是不是保存的模型是最後一個epoch前的模型?

有沒有使用「以在驗證集上表現最好的模型保存」的策略?

在驗證集上的表現情況和訓練集的表現一致嗎?

可以考慮在用pytorch保存的時候保存一些其他參數,如保存時的epoch數,loss數等。因為pytorch保存是用pickle做串列化,所以可以用dict把需要的參數都存起來,載入出來的還是一個dict,很方便。


訓練和測試的時候用的測試代碼是一樣的嗎?訓練的時候測試代碼加上eval了嗎?再或者就是載入數據的時候?


推薦閱讀:
相關文章