ニューラルネットのクラス設計
ここまでに見てきた部品を組み合わせてニューラルネットを設計する。大まかな方針としては、
1.各層および活性化関数のようなネットワークの構成要素をインスタンス変数で保持
2.ネットの動作を実装
となる。
code:net1.py
import torch as pt
import torch.nn as nn
class Mynet(nn.Module): # (1)
def __init__(self):
super().__init__() # (2)
self.lin1 = nn.Linear(4, 10) # 4入力10出力の線形層
self.lin2 = nn.Linear(10, 3) # 線形層の構造は定数値で指定
self.relu = nn.ReLU()
self.softmax = nn.Softmax(dim=1)
def forward(self, x): # (3)
x = self.lin1(x)
x = self.relu(x)
x = self.lin2(x)
x = self.softmax(x)
return x
model = Mynet() # (4)
Point 1
自作のネットワークである Mynet クラスをニューラルネットとして適切に動作させるために、以下2点の処理を行う。
(1)のように、nn.Module を継承する。
(2)のように、コンストラクタの中でスーパークラスのコンストラクタを実行する。
これらはお約束の処理です。
Point 2
コンストラクタにおいて、線形層や活性化関数といったネットワークの構成要素をクラスのインスタンス変数として用意する。 Point 3
forwardメソッドでは、学習データが入力されたときに構成要素がどのように連携して動作するのかを記述する。
https://scrapbox.io/files/6534e30d31fdcf001ca240a4.png
parametersメソッドによるパラメータの取得
parametersメソッドを利用すると、ネットワークが保持する各層のパラメータを取得できる。確認しよう。
code:(続き).py
print('# パラメータの確認')
for param in model.parameters():
print(param.shape)
print(param)
print('--------------------------')
試しに、このネットに1件分のデータを入力する。
code:(続き).py
print('# データの入力')
X = pt.tensor(1, 2, 2, 0, dtype=pt.float)
y = model(X)
print(y)
この時点では、出力の値はLinear型インスタンス生成時にランダムに初期化された重みとバイアスを用いた計算が行われている。これ以降、推定精度を向上させるように学習を行う手法について学ぶ。
/icons/hr.icon
※ ブラウザのバックボタンで戻る