_pickle.UnpicklingErrorが発生しました:pytorchの事前トレーニング済みモデルをロードするときにスタックのアンダーフローを解除します



Encountered _pickle Unpicklingerror



Linuxで、pytorchの事前トレーニングモデルresnet101を読み込もうとしたときに、次のエラーが発生しました。

トレースバック(最後の最後の呼び出し):
ファイル「train_baseline.py」、行272、
cnn = resnet101(pretrained = True).to(device)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torchvision/models/resnet.py」、200行目、resnet101
model.load_state_dict(model_zoo.load_url(model_urls [‘resnet101’]))
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torch/utils/model_zoo.py」、67行目、load_url
torch.load(cached_file、map_location = map_location)を返します
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torch/serialization.py」、368行目、読み込み中
return _load(f、map_location、pickle_module)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torch/serialization.py」、532行目、_load
magic_number = pickle_module.load(f)
_pickle.UnpicklingError:スタックアンダーフローのピクルス解除



その理由は、resenet101が最初にダウンロードされたときに、システムの一時フォルダーの容量が不足していることを示したためです。

OSError:[Errno 18]無効なクロスデバイスリンク: ‘/ tmp / tmpjqtk1ks _’->‘ / home / user / .torch / models / resnet101-5d3b4d8f.pth ’
上記の例外の処理中に、別の例外が発生しました。
トレースバック(最後の最後の呼び出し):
ファイル「train_baseline.py」、行272、
cnn = resnet101(pretrained = True).to(device)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torchvision/models/resnet.py」、200行目、resnet101
model.load_state_dict(model_zoo.load_url(model_urls [‘resnet101’]))
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torch/utils/model_zoo.py」、66行目、load_url
_download_url_to_file(url、cached_file、hash_prefix、progress = progress)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/site-packages/torch/utils/model_zoo.py」、107行目、_download_url_to_file
shutdown.move(f.name、dst)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/shutil.py」、564行目、移動中
copy_function(src、real_dst)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/shutil.py」、263行目、copy2
copyfile(src、dst、follow_symlinks = follow_symlinks)
ファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/shutil.py」、122行目、コピーファイル
copyfileobj(fsrc、fdst)
copyfileobjのファイル「/home/user/anaconda3/envs/ljn/lib/python3.6/shutil.py」、82行目
fdst.write(buf)
OSError:[Errno28]デバイスにスペースが残っていません



容量不足の問題の解決策は、より大きなハードディスク領域に一時フォルダを再作成して定義することです。

export TMPDIR=/mnt/tmp source ~/.bashrc

ただし、一時フォルダーを再定義した後でも、コードの再実行には問題があります。これについては、記事の冒頭で説明しています。

_pickle.UnpicklingError:スタックアンダーフローのピクルス解除

この問題は、resnet101モデルの一部が以前にキャッシュされたが、キャッシュが完了していないため、一時フォルダー内のモデルが不完全になり、ロードが失敗するためです。解決策は、元の一時フォルダー内のresnet101モデルを削除することです。

元のresnet101モデルのパスには、次の2つの可能性があります。

/home/user/.cache/torch/checkpoints

またはそれは可能性があります

/home/user/.torch/models

パスuserはユーザー名ですか、ユーザー名に応じて変更してください。

システムが異なれば特定のパスも異なるため、両方を試すことができます。直接使用lsコマンドが表示されない場合があります~/.cacheまたは~/.torchこのような非表示のフォルダーの場合は、ディレクトリに直接cdできます。

半分ダウンロードしたモデルを削除し、新しい一時フォルダーを定義することを忘れないでください。問題を解決するためにコードを再実行してください。