解決Torch.load()錯誤信息: UnicodeDecodeError: 'ascii' codec can't decode byte 0x8d in position 0: ordinal not in range(128)


使用PyTorch跑pretrained預訓練模型的時候,發現在加載數據的時候會報錯,具體錯誤信息如下:

File “main.py”, line 238, in main_worker
   checkpoint = torch.load(args.resume)
 File “/home/kangyuhao/anaconda3/lib/python3.6/site-packages/torch/serialization.py”, line 387, in load
   return _load(f, map_location, pickle_module, **pickle_load_args)
 File “/home/kangyuhao/anaconda3/lib/python3.6/site-packages/torch/serialization.py”, line 574, in _load
   result = unpickler.load()
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x8d in position 0: ordinal not in range(128)

發現是字符編碼出了問題。經過搜索相關問題,發現是因為pretrained的模型是在python2下訓練的,而自己的環境則是python3,由於兩者字符編碼不兼容,使得預訓練的模型不能加載進來。
一種解決方法是換回python2的環境。
另一種解決方法如下,在源代碼中添加下面的代碼:

from functools import partial
import pickle

pickle.load = partial(pickle.load, encoding="latin1")
pickle.Unpickler = partial(pickle.Unpickler, encoding="latin1")
model = torch.load(model_file, map_location=lambda storage, loc: storage, pickle_module=pickle)

把其中最后一行的model_file替換成自己的pretrained模型文件即可。其原理在於修改了pickle的編碼方式,使得torch.load以python2的方法加載pickle.
實測可行!
參考:https://github.com/CSAILVision/places365/issues/25


免責聲明!

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



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