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