PyTorch 1.5 レシピ : 基本 : PyTorch でニューラルネットワークを定義する (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/08/2020 (1.5.0)
* 本ページは、PyTorch 1.5 Recipes の以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、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 でニューラルネットワークを定義する
イントロダクション
ニューラルネットワークを作成して訓練することを助けるために PyTorch はエレガントに設計された、torch.nn を含む、モジュールとクラスを提供します。nn.Module は層と出力を返すメソッド forward(input) を含みます。
このレシピでは、MNIST データセット を対象とするニューラルネットワークを定義するために torch.nn を利用します。
ステップ
- データをロードするために総ての必要なライブラリをインポートする。
- ニューラルネットワークを定義して初期化します。
- データモデルを通してどのようにデータを渡すかを指定します。
- [オプション] テストするためにモデルを通してデータを渡します。
1. データをロードするために必要なライブラリをインポートする
このレシピのため、torch とその補助 torch.nn と torch.nn.functional を使用します。
import torch import torch.nn as nn import torch.nn.functional as F
2. ニューラルネットワークを定義して初期化する
私達のネットワークは画像を認識します。畳込みと呼ばれる PyTorch 内に構築されたプロセスを利用します。畳込みは画像の各要素を、カーネル、または小さい行列により重み付けられた、その局所近傍に追加します、これは入力画像から (エッジ検出、シャープさ、不鮮明さのような) 特定の特徴を抽出する助けとなります。
貴方のモデルの Net クラスを定義するために 2 つの要件があります。最初は nn.Module を参照する __init__ 関数を書くことです。この関数は貴方のニューラルネットワークの完全結合層を定義するところです。
畳込みを使用して、1 入力画像チャネルを取り、そして数字 0 から 9 を表す 10 ラベルのターゲットに適合する出力を吐きます。このアルゴリズムは作成する貴方のものです、私達は標準的な MNIST アルゴリズムに従います。
class Net(nn.Module): def __init__(self): super(Net, self).__init__() # First 2D convolutional layer, taking in 1 input channel (image), # outputting 32 convolutional features, with a square kernel size of 3 self.conv1 = nn.Conv2d(1, 32, 3, 1) # Second 2D convolutional layer, taking in the 32 input layers, # outputting 64 convolutional features, with a square kernel size of 3 self.conv2 = nn.Conv2d(32, 64, 3, 1) # Designed to ensure that adjacent pixels are either all 0s or all active # with an input probability self.dropout1 = nn.Dropout2d(0.25) self.dropout2 = nn.Dropout2d(0.5) # First fully connected layer self.fc1 = nn.Linear(9216, 128) # Second fully connected layer that outputs our 10 labels self.fc2 = nn.Linear(128, 10) my_nn = Net() print(my_nn)
ニューラルネットワークを定義することを終了しました、今はデータがそれにどのように渡されるかを定義しなければなりません。
3. データがモデルにどのように渡されるか指定する
モデルを構築するために PyTorch を使用するとき、単に forward 関数を定義しなければなりません、これはデータを計算グラフ (i.e. ニューラルネットワーク) に渡します。これは feed-forward アルゴリズムを表します。
forward 関数で任意の Tensor 演算を利用できます。
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) self.dropout1 = nn.Dropout2d(0.25) self.dropout2 = nn.Dropout2d(0.5) self.fc1 = nn.Linear(9216, 128) self.fc2 = nn.Linear(128, 10) # x represents our data def forward(self, x): # Pass data through conv1 x = self.conv1(x) # Use the rectified-linear activation function over x x = F.relu(x) x = self.conv2(x) x = F.relu(x) # Run max pooling over x x = F.max_pool2d(x, 2) # Pass data through dropout1 x = self.dropout1(x) # Flatten x with start_dim=1 x = torch.flatten(x, 1) # Pass data through fc1 x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) # Apply softmax to x output = F.log_softmax(x, dim=1) return output
4. [オプション] テストするためにデータをモデルを通して渡す
望まれる結果を受け取ることを確実にするため、モデルをそれを通して幾つかのランダムデータを渡すことによりテストしましょう。
# Equates to one random 28x28 image random_data = torch.rand((1, 1, 28, 28)) my_nn = Net() result = my_nn(random_data) print (result)
この結果としての tensor の各数字はランダム tensor が関連するラベルの予測に等しいです。
Congratulations! PyTorch でニューラルネットワークを成功的に定義しました。
以上