PyTorch 1.8 チュートリアル : レシピ : 基本 :- PyTorch でニューラルネットワークを定義する (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/19/2021 (1.8.0)
* 本ページは、PyTorch 1.8 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:
- PyTorch Recipes : Basics : Defining a Neural Network 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 でニューラルネットワークを定義する
イントロダクション
ニューラルネットワークを作成して訓練することを助けるために PyTorch はエレガントに設計された、torch.nn を含む、モジュールとクラスを提供します。nn.Module は層と出力を返すメソッド forward(input) を含みます。
このレシピでは、MNIST データセット を対象とするニューラルネットワークを定義するために torch.nn を利用します。
セットアップ
始める前に、torch をそれがまだ利用可能でないのであればインストールする必要があります。
pip install torch
ステップ
- データをロードするために総ての必要なライブラリをインポートする。
- ニューラルネットワークを定義して初期化します。
- データがモデルを通してどのように渡されるかを指定します。
- [オプション] テストするためにデータをモデルに渡します。
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)
Net( (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1)) (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (dropout1): Dropout2d(p=0.25, inplace=False) (dropout2): Dropout2d(p=0.5, inplace=False) (fc1): Linear(in_features=9216, out_features=128, bias=True) (fc2): Linear(in_features=128, out_features=10, bias=True) )
ニューラルネットワークを定義することを終了しました、今はデータがそれにどのように渡されるかを定義しなければなりません。
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([[-2.3635, -2.3717, -2.4002, -2.2627, -2.2932, -2.2674, -2.2768, -2.2388, -2.2504, -2.3153]], grad_fn=)
この結果としての tensor の各数字はランダム tensor に関連付けられたラベルの予測に等しいです。
Congratulations! PyTorch でニューラルネットワークを成功的に定義しました。
以上