python3.6下解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0的方法

毕设在跑KaiyangZhou的深度行人重识别程序,该程序给多种深度网络和loss function提供了一个接口,可以轻松使用各种组合实现行人重识别

在test中,我在命令行输入:

python train_img_model_xent.py -d market1501 -a resnet50 --evaluate --resume saved-models/resnet50_xent_market1501.pth.tar --save-dir log/resnet50-xent-market1501 --test-batch 32

报错:

Traceback (most recent call last):
  File "train_img_model_xent.py", line 251, in 
    main()
  File "train_img_model_xent.py", line 136, in main
    checkpoint = torch.load(args.resume)
  File "C:\Users\Liang\Anaconda3\lib\site-packages\torch\serialization.py", line 268, in load
    return _load(f, map_location, pickle_module)
  File "C:\Users\Liang\Anaconda3\lib\site-packages\torch\serialization.py", line 421, in _load
    result = unpickler.load()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

查看源文件,发现出错代码段长这样:

_sys_info = pickle_module.load(f)
    unpickler = pickle_module.Unpickler(f)
    unpickler.persistent_load = persistent_load
    result = unpickler.load()

经过试验发现,把该段代码改成

_sys_info = pickle_module.load(f, encoding='iso-8859-1')
    unpickler = pickle_module.Unpickler(f, encoding='iso-8859-1')
    unpickler.persistent_load = persistent_load
    result = unpickler.load()

问题解决,不报错。


另外,在解决问题的探寻查询网上博客,发现很多人在说这是编码的问题:Python在进行编码方式之间的转换时,会将 unicode 作为“中间编码”,但 unicode 最大只有 128 那么长,所以这里当尝试将 ascii 编码字符串转换成"中间编码" unicode 时由于超出了其范围,就报出了如上错误。

同时网上的很多解决方法是在python文件的前面加上如下代码:

import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
    reload(sys)
    sys.setdefaultencoding(defaultencoding)

经试验发现,这种方法仅适用于python2.7,在python3中不适用,因为python3已经取消了reload,而在对于编码方法做了很大的调整

具体改动请参见点击打开链接






你可能感兴趣的:(python3.6下解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0的方法)