1. torch.nn.Module の紹介
torch.nn
これにより、ニューラル ネットワークをより洗練された方法でトレーニングし、ニューラル ネットワーク コードをより簡潔かつ柔軟にすることができます。公式ドキュメント: Torch.NN。
ドキュメントでは、コンテンツの最初の部分が Container (コンテナー) と呼ばれ、ニューラル ネットワークの骨格に相当することがわかります. Container の後の部分は、Convolution Layers (畳み込み層) など、骨格を埋めるために使用されます。 )、Pooling Layers(プーリング層。レイヤー)、畳み込みニューラルネットワークの基礎を持っている人は、これらの言葉に精通しているはずです。
Module
Container には、Sequential
、ModuleList
、ModuleDict
、の 6 つのモジュールがあります。ParameterList
最もParameterDict
一般的に使用されるのはModule
、すべてのニューラル ネットワークの最も基本的なクラスである であり、その基本的な構築方法は次のとおりです。
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self): # 初始化
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
def forward(self, x): # 前向传播
x = F.relu(self.conv1(x)) # 将 x 进行第一层卷积后用 ReLU 激活函数输出
return F.relu(self.conv2(x)) # 将处理后的 x 再进行第二层卷积后用 ReLU 处理后返回最后结果
ここで、単純なニューラル ネットワークを自分で作成し、順伝播の結果を出力してみます。
import torch
import torch.nn as nn
class Network(nn.Module):
def __init__(self): # 初始化
super(Network, self).__init__()
def forward(self, input):
output = input + 1
return output
network = Network()
x = torch.tensor(1.0) # x 为 tensor 类型
output = network(x) # Module 中的 __call__ 函数会调用 forward 函数
print(output) # tensor(2.)
2.畳み込みニューラルネットワークの原理
畳み込みニューラル ネットワーク (CNN) における畳み込み演算は、画像処理における "フィルター演算" に相当します。入力データの場合、畳み込み操作はフィルター (畳み込みカーネル) のウィンドウを特定の間隔 (ステップ サイズ) でスライドさせて適用します。下の図に示すように、各位置のフィルターの要素は、入力の対応する要素で乗算され、合計されます (この計算は、積和演算と呼ばれることがあります)。次に、この結果を出力の対応する場所に保存します。このプロセスをすべての位置で実行して、畳み込み演算の出力を取得します。
完全に接続されたニューラル ネットワークでは、重みパラメーターに加えて、バイアスもあります。CNN では、フィルターのパラメーターは前の重みに対応します。また、CNN には偏りがあります。バイアスを含む畳み込み演算の処理フローを次の図に示します。
畳み込みニューラル ネットワークの詳細については、[Study Notes] Introduction to Deep Learning: Theory and Implementation Based on Python を参照してください。
それでは、PyTorch に戻りましょう。Conv2d
関数を。関数の公式ドキュメント: TORCH.NN.FUNCTIONAL.CONV2Dです。
この関数には次のパラメータがあります。
input
: サイズ の入力画像(mini_batch, in_channels, height, width)
。weight
: 畳み込みカーネルのサイズ。サイズは です(out_channels, in_channels/groups, height, width)
。bias
: バイアス。デフォルトは ですNone
。stride
: 畳み込みカーネルの移動間隔を制御するために使用されるステップ サイズ.x
の場合,水平方向と垂直方向の両方のステップ サイズは ですx
.(x, y)
の垂直方向のステップ サイズは でありx
, のステップ サイズは です.横方向は ですy
。padding
: エッジ拡張操作は、入力および出力の前後の画像のサイズが変更されないようにするために、入力画像のエッジで実行されます. PyTorch の畳み込みレイヤーの定義では、デフォルトはpadding
ゼロ端に 0 をパディングします。padding_mode
: エッジの拡張方法。dilation
: フェッチ間の間隔を設定します。
例えば:
import torch
import torch.nn.functional as F
input = torch.tensor([
[1, 2, 3, 0],
[0, 1, 2, 3],
[3, 0, 1, 2],
[2, 3, 0, 1]
])
kernel = torch.tensor([
[2, 0, 1],
[0, 1, 2],
[1, 0, 2]
])
input = torch.reshape(input, (1, 1, 4, 4)) # batch_size = 1,channel = 1
kernel = torch.reshape(kernel, (1, 1, 3, 3))
output = F.conv2d(input, kernel, stride=1)
print(output)
# tensor([[[[15, 16],
# [ 6, 15]]]])
output = F.conv2d(input, kernel, stride=1, bias=torch.tensor([3])) # 注意 bias 必须也是矩阵
print(output)
# tensor([[[[18, 19],
# [ 9, 18]]]])