Pytorch自定義加載預訓練權重


pytorch保存模型權重非常方便

 

保存模型可以分為兩種

一種是保存整個網絡(網絡結構+權重參數)

torch.save(model, 'net.pth.tar')

一種是只保存模型的權重參數(速度快,內存占用少)

torch.save(model.state_dict(), 'net.pth.tar')

標准的加載還可以做一些設置

 

如果加載模型只是為了進行推理測試,則將每一層的 requires_grad 置為 False,即固定這些權重參數;還需要調用 model.eval() 將模型置為測試模式,主要是將 dropout 和 batch normalization 層進行固定,否則模型的預測結果每次都會不同。

如果希望繼續訓練,則調用 model.train(),以確保網絡模型處於訓練模式。

 

然后,想使用預訓練權重有非常嚴格的要求,要求每一層一模一樣,命名都要一樣(不然dict的key就不一樣了

如果兩個模型實際是一樣,既然是字典,可不可以手動賦值呢?

比如,我把cnn命名成conv了,導致load失敗,因此我們來手動賦值

 

雖然load成功了,但是實際效果有點問題,直接用於生成,得到的圖像顏色不對。

按道理兩種方法的權重應該是一模一樣啊,

 

前兩個是手動賦值,顏色都有偏差,第三個直接load的正常。。。

難道model.state_dict() 沒有包含所有的權重信息?

 

其實還有一個簡便方法:使用strict=False 參數

model.load_state_dict(checkpoint["state_dict"], strict=False)
optimizer.load_state_dict(checkpoint["optimizer"])

奇怪的是,model的load_state_dict有strict參數,optimizer沒有

 

 

參考鏈接:https://zhuanlan.zhihu.com/p/73893187


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM