<jupyter_start><jupyter_text>モデルの保存と読み込みこのユニットでは、モデル予測の保存、読み込み、実行によってモデルの状態を持続させる方法を見ていきます。<jupyter_code>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(), 'data/model_weights.pth')<jupyter_output>Downloading: "https://download.pytorch.org/models/vgg16-397923af.pth" to /Users/shogo/.cache/torch/hub/checkpoints/vgg16-397923af.pth
100%|██████████| 528M/528M [00:08<00:00, 63.2MB/s]<jupyter_text>モデルのウェイトをロードするには、まず同じモデルのインスタンスを作成し、`load_state_dict()`メソッドを使ってパラメータをロードする必要があります。<jupyter_code>model = models.vgg16()  # we do not specify pretrained=True, i.e. do not load default weights
model.load_state_dict(torch.load('data/model_weights.pth'))
model.eval()<jupyter_output><empty_output><jupyter_text>> **Note:** 推論を行う前に、必ず`model.eval()`メソッドを呼び出し、ドロップアウトとバッチ正規化のレイヤーを評価モードに設定してください。これを行わないと、推論結果に一貫性がなくなります。  シェイプ付きモデルの保存と読み込みモデルの重みを読み込む際には、まずモデルクラスをインスタンス化する必要がありました。モデルクラスはネットワークの構造を定義しているからです。このクラスの構造をモデルと一緒に保存したい場合は、`model`（`model.state_dict()`ではなく）を保存関数に渡します。<jupyter_code>torch.save(model, 'data/vgg_model.pth')<jupyter_output><empty_output><jupyter_text>そして、次のようにモデルを読み込みます。<jupyter_code>model = torch.load('data/vgg_model.pth')<jupyter_output><empty_output><jupyter_text>> **Note:** この方法は、モデルをシリアル化する際にPythonの[pickle](https://docs.python.org/3/library/pickle.html)モジュールを使用するため、モデルをロードする際に実際のクラス定義が利用可能であることに依存します。  モデルのONNXへのエクスポートPyTorchは、ONNXへのエクスポートをネイティブにサポートしています。しかし、PyTorch の実行グラフは動的であるため、エクスポート処理では実行グラフを横断して ONNX モデルを生成する必要があります。このため、適切なサイズのテスト変数をエクスポートルーチンに渡す必要があります（ここでは、適切なサイズのダミーのゼロテンソルを作成します）。<jupyter_code>input_image = torch.zeros((1,3,224,224))
onnx.export(model, input_image, 'data/model.onnx')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13155136268343814, 'fraction_numerical': 0.025681341719077568, 'mean_word_length': 15.456896551724139, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 26, 'https://': 2, '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': '517707', 'license': 'CC-BY-4.0', 'n_tokens_mistral': 1227, 'n_tokens_neox': 1165, 'n_words': 51, 'path': 'Introduction-to-PyTorch/08.Save_load_and_run_model_predictions.ipynb', 'repo_name': 'SchwarzKatzeZwei/MSLearn-to-PyTorch', 'size': '1908'}