PyTorch 1.8 チュートリアル : レシピ : 基本 :- PyTorch の state_dict とは何か (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/21/2021 (1.8.0)
* 本ページは、PyTorch 1.8 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:
- PyTorch Recipes : Basics : Wat is a state_dict in PyTorch
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
レシピ : 基本 :- PyTorch の state_dict とは何か
PyTorch では、torch.nn.Module の学習可能なパラメータは (model.parameters() でアクセスされる) モデルのパラメータに含まれます。state_dict は各層をそのパラメータ tensor にマップする Python 辞書オブジェクトです。
イントロダクション
貴方が PyTorch からのモデルをセーブしてロードすることに興味があれば state_dict は不可欠な実在です。state_dict オブジェクトは Python 辞書ですので、それらは容易にセーブされ、更新され、変更されてリストアできて、PyTorch モデルと optimizer に多くのモジュール性を追加します。学習可能なパラメータ (畳込み層、線形層等) と登録されたバッファ (バッチ正規化の running_mean) を持つ層だけがモデルの state_dict でエントリを持つことに注意してください。optimizer オブジェクト (torch.optim) はまた state_dict を持ちます、これは使用されたハイパーパラメータに加えて、optimizer の状態についての情報を含みます。このレシピでは、state_dict が単純なモデルでどのように使用されるかを見ます。
セットアップ
始める前に、torch をそれがまだ利用可能でないならばインストールする必要があります。
pip install torch
ステップ
- データをロードするために総ての必要なライブラリをインポートする
- ニューラルネットワークを定義して初期化する
- optimizer を初期化する
- モデルと optimizer state_dict にアクセスする
1. データをロードするために総ての必要なライブラリをインポートする
このレシピのため、torch とその従属 torch.nn と torch.optim を利用します。
import torch
import torch.nn as nn
import torch.optim as optim
2. ニューラルネットワークを定義して初期化する
サンプルのため、訓練画像のためにニューラルネットワークを作成します。更に学習するためには Defining a Neural Network レシピを見てください。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
print(net)
Net( (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1)) (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1)) (fc1): Linear(in_features=400, out_features=120, bias=True) (fc2): Linear(in_features=120, out_features=84, bias=True) (fc3): Linear(in_features=84, out_features=10, bias=True) )
3. optimizer を初期化する
SGD with モメンタムを利用します。
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
4. モデルと optimizer state_dict にアクセスする
モデルと optimizer を構築した今、それぞれの state_dict プロパティで何が保存されているかを理解できます。
# Print model's state_dict
print("Model's state_dict:")
for param_tensor in net.state_dict():
print(param_tensor, "\t", net.state_dict()[param_tensor].size())
print()
# Print optimizer's state_dict
print("Optimizer's state_dict:")
for var_name in optimizer.state_dict():
print(var_name, "\t", optimizer.state_dict()[var_name])
Model's state_dict: conv1.weight torch.Size([6, 3, 5, 5]) conv1.bias torch.Size([6]) conv2.weight torch.Size([16, 6, 5, 5]) conv2.bias torch.Size([16]) fc1.weight torch.Size([120, 400]) fc1.bias torch.Size([120]) fc2.weight torch.Size([84, 120]) fc2.bias torch.Size([84]) fc3.weight torch.Size([10, 84]) fc3.bias torch.Size([10]) Optimizer's state_dict: state {} param_groups [{'lr': 0.001, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}]
この情報は将来の利用のためにモデルと optimizer をセーブしてロードするために適切です。
Congratulations! PyTorch で state_dict を成功的に使用しました。
以上