Pytorch加载模型时报错:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc3 in position 875: ordinal not in range(128)
问题原因:
Pytorch在加载模型时候,如果训练保存模型的python环境是2.7,然而在python3的环境中去load模型,就会出现上面的错误,
>>> import torch
>>> model = torch.load('../abcd.pth')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/zhangboshen/anaconda3/lib/python3.6/site-packages/torch/serialization.py", line 358, in load
return _load(f, map_location, pickle_module)
File "/home/zhangboshen/anaconda3/lib/python3.6/site-packages/torch/serialization.py", line 529, in _load
result = unpickler.load()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 875: ordinal not in range(128)
这个问题目前pytorch官方的API中貌似还无法解决,因为这是pickle在python2和3两种环境中保存文件的编码方式不一致导致的,然而 torch.load()方法并没有提供类似于data = pickle.load(f, encoding='latin1')
这种可以设置encoding的方法。
所以,我的方法是conda create -n py27 python=2.7
,也就创造一个新的python2的环境来load模型,当然了,pytorch也需要重新安装。。。
可能看起来有点笨重,但是it worked!
关于这个问题的一些讨论:
https://github.com/pytorch/pytorch/issues/5994
https://discuss.pytorch.org/t/error-while-loading-saved-model-post-update-of-pytorch/14369/5
https://github.com/pytorch/pytorch/commit/54d5c53826479142fcf1e4de3ad77f8e4b81c123
如果大家有更好的解决方法,也欢迎分享给我:)
BTW,创建新的python环境并且安装完pytorch后,import torch的时候我这里又出现了一个这样的错误:
>>> import torch
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/zhangboshen/anaconda3/envs/py27/lib/python2.7/site-packages/torch/__init__.py", line 84, in <module>
from torch._C import *
ImportError: numpy.core.multiarray failed to import
解决方法是重新安装numpy:
pip install numpy