2023.08.09 NNの重み行列確認(順序について)【torch】
全結合層のレイヤが保持する重み行列のサイズを確認してみよう。
重みの順番はインスタンス変数として宣言された順に並んでいることがわかるだろうか。
各層の接続順序は、forward() メソッドで構成されることになる。
ファイル名:NNshape1.py
code:python
import torch
import torch.nn as nn
import torch.nn.functional as F
def show_params_shape(model):
params = list(model.parameters())
print('重みの数:', len(params))
for i in range(len(params)):
print(i, paramsi.shape)
class Net1(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(2, 5)
class Net2(nn.Module):
def __init__(self):
super().__init__()
self.layer2 = nn.Linear(5, 1)
self.layer1 = nn.Linear(2, 5)
class Net3(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(2, 5)
self.layer2 = nn.Linear(5, 1)
def hoge(self):
self.layer3 = nn.Linear(3, 3)
# コンストラクタでなくても、レイヤを生成できる。
print('# 全結合レイヤ(1層)')
model1 = Net1()
show_params_shape(model1)
print('# 全結合レイヤ(2層)')
model2 = Net2()
show_params_shape(model2)
print('# 全結合レイヤ(3層)')
model3 = Net3()
model3.hoge() # layer3の生成
show_params_shape(model3)
結果:
code:python
# 全結合レイヤ(1層)
重みの数: 2 # Net1
0 torch.Size(5, 2) # layer1 の重み
1 torch.Size(5) # layer1 のバイアス
# 全結合レイヤ(2層)
重みの数: 4 # Net2
0 torch.Size(1, 5) # layer2 の重み
1 torch.Size(1) # layer2 のバイアス
2 torch.Size(5, 2) # layer1 の重み
3 torch.Size(5) # layer1 のバイアス
# 全結合レイヤ(3層)
重みの数: 6 # Net3
0 torch.Size(1, 5) # layer1 の重み
1 torch.Size(1) # layer1 のバイアス
2 torch.Size(5, 2) # layer3 の重み
3 torch.Size(5) # layer3 のバイアス
4 torch.Size(3, 3) # layer2 の重み
5 torch.Size(3) # layer2 のバイアス
ちなみに、全結合層(nn.Linear)の場合、
入力 $ x\in \mathbf{R}^{n}
出力 $ y \in {\mathbf R}^{m}
の重み行列のサイズは $ W\in \mathbf{R}^{n \times m}、バイアスは$ b \in \mathbf{R}^{m}となる。数式で表すと
$ y = W x + b
であり、両辺ともに縦ベクトルで表記される線形代数の分野ではスタンダードな形式である。機械学習の文献でよくある表記の
$ y^\mathrm{T} = x^\mathrm{T} W^\mathrm{T} + b^\mathrm{T}
と意味は同じであるが、こちらは横ベクトルで表現している点に注意。後者の方が、バッチ学習の際に
$ \left[\begin{array}{c} y_1 \\ y_2 \\ \vdots \\ y_k \end{array}\right] = \left[\begin{array}{c} x_1 \\ x_2 \\ \vdots \\ x_k \end{array}\right] W^\mathrm{T}+ \left[\begin{array}{c} b \\ b \\ \vdots \\ b \end{array}\right]
のように各バッチを縦に積むことで容易に表記できるので広く利用されている。
2023.08.09 NNの重み行列確認(活性化関数)【torch】