<jupyter_start><jupyter_text>「PyTorch入門  7. モデルの保存・読み込み」===============================================================【原題】SAVE AND LOAD THE MODEL【原著】[<NAME>](https://github.com/suraj813)、[<NAME>](https://github.com/sethjuarez/) 、[<NAME>](https://github.com/cassieview/) 、[<NAME>](https://soshnikov.com/)、[<NAME>](https://github.com/aribornstein/) 【元URL】https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html【翻訳】電通国際情報サービスISID AIトランスフォーメーションセンター　小川 雄太郎【日付】2021年03月20日【チュトーリアル概要】本チュートリアルでは、PyTorchでモデルを保存する方法、および保存したモデルのロードについて解説します。--- モデルの保存と読み込み============================本チュートリアルでは、モデルの状態を継続させるために、モデルの保存する方法とモデルを読み込み推論を実行する方法について解説します。<jupyter_code>%matplotlib inline
import torch
import torch.onnx as onnx
import torchvision.models as models<jupyter_output><empty_output><jupyter_text>モデルの重みの保存と読み込み--------------------------------PyTorchのモデルは学習したパラメータを内部に状態辞書（``state_dict``）として保持しています。これらのパラメータの値は ``torch.save`` を使用することで、永続化させることができます。<jupyter_code>model = models.vgg16(pretrained=True)
torch.save(model.state_dict(), 'model_weights.pth')<jupyter_output>Downloading: "https://download.pytorch.org/models/vgg16-397923af.pth" to /root/.cache/torch/hub/checkpoints/vgg16-397923af.pth<jupyter_text>モデルの重みを読み込むためには、予め同じモデルの形をしたインスタンスを用意します。そしてそのインスタンスに対して``load_state_dict()``メソッドを使用し、パラメータの値を読み込みます。<jupyter_code>model = models.vgg16() # pretrained=Trueを引数に入れていないので、デフォルトのランダムな値になっています
model.load_state_dict(torch.load('model_weights.pth'))
model.eval()<jupyter_output><empty_output><jupyter_text>【注意】ドロップアウトやバッチノーマライゼーションレイヤーをevaluationモードに切り替えるために、推論前には ``model.eval()``を実行することを忘れないようにしてください。これを忘れると、推論結果が正確ではなくなります。 --- モデルの形ごと保存・読み込む方法-------------------------------------モデルの重みをロードする場合は、先にモデルのインスタンスを用意する必要があります。モデルクラスの構造も一緒に保存したい場合もあるかと思います。その際は保存時に、``model.state_dict()``ではなく``model``を渡します。<jupyter_code>torch.save(model, 'model.pth')<jupyter_output><empty_output><jupyter_text>モデルをロードするには、以下のように記載します。<jupyter_code>model = torch.load('model.pth')<jupyter_output><empty_output><jupyter_text>【注意】上記の方法はPythonの[`pickle`](https://docs.python.org/3/library/pickle.html)モジュールをモデルのシリアライズに使用します。そのため、モデルのロード時に実際のクラス定義が利用可能である必要があります。【日本語訳注】上記の表現は理解が少し難しいのですが、言いたいことは、モデルのモジュールに独自クラスを定義して使用している場合、`torch.load`を実行する前に、その独自クラスをimportするか宣言するかして、使用可能な状態にしておく必要があります、という意味です。でないと、`load`時に不明なクラスを使用することになり読み込みエラーとなります。 --- ONNX形式でのモデル出力：Exporting Model to ONNX-----------------------PyTorchはONNX形式でのモデル出力もサポートしています。しかしPyTorchの計算グラフは動的に生成されるため、出力処理では計算グラフを一度実行して作成してから、ONNXモデルを生成する必要があります。すなわち、実際に一度データを流してみる必要があります。そのため、テスト用の適切なテンソルサイズの入力変数を用意し、モデル出力の処理に渡す必要があります。以下ではダミーのゼロテンソルを適切なサイズで作成して使用しています。<jupyter_code>input_image = torch.zeros((1,3,224,224))
onnx.export(model, input_image, 'model.onnx')

# 日本語訳注：このセルを実行するとmodel.onnxというファイルが生成されます<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.18945102260495156, 'fraction_numerical': 0.014711158952278435, 'mean_word_length': 10.568464730290456, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '250988', 'license': 'zlib-acknowledgement', 'n_tokens_mistral': 1753, 'n_tokens_neox': 1677, 'n_words': 50, 'path': 'notebook/0_Learn the Basics/0_7_saveloadrun_tutorial_js.ipynb', 'repo_name': 'shige-ta/pytorch_tutorials_jp', 'size': '2827'}