1. ホーム
  2. python

UnicodeDecodeError: 'ascii' コーデックは、python3.6でポジション0のバイト0xe9をデコードできないことに対する解決策です。

2022-02-19 03:58:19

BixiはKaiyangZhouの深層歩行者再識別プログラムを実行しており、様々な深層ネットワークと損失関数へのインターフェースを提供しているため、様々な組み合わせで歩行者再識別を簡単に実装することができます。

テストでは、コマンドラインで入力しました。

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 <module>
    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しかないので、asciエンコーディングの文字列を"中間エンコーディング" unicodeに変換しようとして、その範囲外になってしまうと上記のようにエラーが報告されるのです。 "です。

<スパン 一方、ウェブ上の多くのソリューションは、以下のコードでpythonファイルをプレフィックスしています。

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

テストした結果、この方法は python 2.7 でのみ動作し、python 3 では動作しないことがわかりました。

変更点の詳細については クリックするとリンクが開きます