Linear関数【torch】
説明:線形層の処理を行うインスタンスを生成する関数
書式:
torch.nn.Linear(引数1, 引数2)
引数
引数1:入力の特徴量の数
引数2:出力の特徴良の数
戻り値
生成した線形層
3入力-2出力の線形層を生成する。
code:torch_linear1.py
import torch.nn as nn
lin1 = nn.Linear(3, 2)
入力$ \mathbf{x} \in\mathrm{R}^3から出力$ \mathbf{y} \in \mathrm{R}^2への計算過程は次の線形変換により表現される。
$ \mathbf{y} \leftarrow \mathbf{x} W^\top + \mathbf{b}
要素を表記すると、
$ \left[ \begin{array}{cc} y_{0} & y_{1} \end{array}\right] \leftarrow \left[ \begin{array}{ccc} x_{0} & x_{1} & x_{2} \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} \end{array}\right]
となる。ここで、$ W は重みや重み行列、$ b = \left[ \begin{array}{cc} b_{0} & b_{1} \end{array}\right] はバイアスとよばれる。
重みとバイアスはインスタンスを生成したときにランダムに初期化される。値を確認してみよう。Linear型オブジェクトのparametersメソッドを呼び出すと、重みとバイアスをジェネレータ型のオブジェクトとして取得できる。
code:torch_linear2.py
import torch.nn as nn
lin1 = nn.Linear(3, 2)
params = lin1.parameters()
param = list(params) # ジェネレータの全要素をリストに抽出
print('# 重み -----------------')
print(param0.shape)
print(param0)
print('# バイアス -----------------')
print(param1.shape)
print(param1)
具体的に計算を行ってみる。Linear型はnn.Moduleクラスのサブクラスであるため、変数名を直接利用して処理を行うことができる。
code:torch_linear3.py
import torch as pt
import torch.nn as nn
lin1 = nn.Linear(3, 2)
X = pt.tensor(1, 2, -1, dtype=pt.float)
y = lin1(X)
print('# 入力 --------------')
print(X)
print('# 出力 --------------')
print(y)
注意1:
入力はテンソルで与える必要がある。
code:ダメ.py
import numpy as np
import torch.nn as nn
lin1 = nn.Linear(3, 2)
X = np.array(1, 2, -1, dtype=float) # 配列はNG
y = lin1(X)
注意2:
入力されるテンソルのデータ型は32ビット長のtorch.float型の必要がある。整数型のtorch.int型や、より精度の高いtorch.float64型を処理することはできない。
code:ダメ.py
import torch as pt
import numpy as np
lin1 = pt.nn.Linear(3, 2)
X1 = pt.tensor(1, 2, -1, dtype=pt.int)
y1 = lin1(X1)
X2 = pt.tensor(1, 2, -1, dtype=pt.float64)
y2 = lin1(X2)