PyTorch 1.8 レシピ : 基本 : PyTorch の state_dict とは何か

PyTorch 1.8 チュートリアル : レシピ : 基本 :- PyTorch の state_dict とは何か (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/21/2021 (1.8.0)

* 本ページは、PyTorch 1.8 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく 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

 

ステップ

  1. データをロードするために総ての必要なライブラリをインポートする
  2. ニューラルネットワークを定義して初期化する
  3. optimizer を初期化する
  4. モデルと 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 を成功的に使用しました。

 

以上