線形層
線形層は様々な種類のニューラルネットにおいて用いられる基本的なネットワーク層である。
まず、Linear関数【torch】を参照して、基本的な使い方を理解しよう。
バッチデータの入力
実際のニューラルネットの学習においては、学習に用いられるデータは単一ではなく、複数をまとめて入力することが一般的である。複数のデータをまとめたものをバッチデータと呼ぶ。
ここでは2件分から構成されるバッチを入力した際の線形層のふるまいを確認する。
code:torch_lin2.py
import torch as pt
import torch.nn as nn
lin1 = nn.Linear(3, 2)
X = pt.tensor(1, 2, 2], [0, -1, 2, dtype=pt.float) # (1) 2件分のデータ
y = lin1(X)
print('入力:', type(X), X.shape)
print(X)
print('出力:', type(y), y.shape)
print(y)
実行結果を以下に示す。
code:(結果).txt
入力: <class 'torch.Tensor'> torch.Size(2, 3)
tensor([ 1., 2., 2.,
0., -1., 2.])
出力: <class 'torch.Tensor'> torch.Size(2, 2)
tensor([-1.0273, -0.9680,
-0.2280, 0.7624], grad_fn=<AddmmBackward0>)
2件の入力それぞれに対する出力を並べたテンソルが出力となる。
計算過程を書き出してみる。
$ \left[ \begin{array}{cc} y_{00} & y_{01} \\ \hline y_{01} & y_{11} \end{array}\right] \leftarrow \left[ \begin{array}{ccc} x_{00} & x_{01} & x_{02} \\ \hline x_{10} & x_{11} & x_{12} \end{array}\right] \times \left[ \begin{array}{ccc} w_{00} & w_{01} & w_{02} \\ w_{10} & w_{11} & w_{12} \end{array}\right]^\top + \left[ \begin{array}{cc} b_{0} & b_{1} \\ \hline b_{0} & b_{1}\end{array}\right]
入力データ
1件目$ \left[\begin{array}{ccc} x_{00} & x_{01} & x_{02}\end{array} \right]
2件目$ \left[\begin{array}{ccc} x_{10} & x_{11} & x_{12}\end{array} \right]
出力データ
1件目$ \left[\begin{array}{cc} y_{00} & y_{01} \end{array} \right]
2件目$ \left[\begin{array}{cc} y_{01} & y_{11} \end{array} \right]
という関係になっている。
バイアスの項($ b_*)はブロードキャストによって、入力データの件数に応じてサイズが拡大されている。
/icons/hr.icon
※ ブラウザのバックボタンで戻る
https://scrapbox.io/files/6501861a3123f1001c454fce.png