他の人からより良く学び、
より良いものになりますように。
—— 「ウェイカ・ジーシャン」
この記事の長さは 17309ワードで、読むのにかかる時間は 5分です。
序文
前回の記事「pyTorch 入門 (1) - Minist 手書きデータ認識トレーニングの完全接続ネットワーク」では、完全接続層とトレーニング ファイルを構築し、最も単純な Minist トレーニングを実行し、最終的なトレーニング結果は 97% に達しました。より一般的に使用される API および pyTorch ネットワーク層の畳み込み層
# | 共通のネットワーク層機能 |
---|---|
nn.リニア | 信号の線形結合 |
nn.Conv2d | 複数の 2D 信号の 2D 畳み込み |
nn.MaxPool2d | 2D 信号の最大プーリング |
nn.ReLU | 最も一般的に使用されるアクティベーション関数 |
nn.CrossEntropyLoss | 損失関数、nn.LogSoftmax() と nn.NLLLoss() を組み合わせたクロスエントロピー計算 |
最適.SGD | オプティマイザー、確率的勾配降下法 |
optim.zero_grad | 管理パラメータ勾配をクリアします (テンソル勾配は自動的にクリアされませんが、蓄積されます) |
最適なステップ | 重みパラメータを一度更新します |
nn.シーケンシャル | ネットワーク層を順番にラップするために使用されます |
上記は最もよく使用される関数であり、これらを使用したトレーニングを完了するには Minist トレーニングで十分です。入力パラメーターを必要とする次の関数に焦点を当てます。
nn.Linear(パラメータ) 信号の線形結合
-
in_features: 入力ノードの数
-
out_features: 出力ノードの数
-
bias : バイアスが必要かどうか
nn.Conv2d(parameter) は、複数の 2 次元信号に対して 2 次元の畳み込みを実行します。
-
in_channels: 入力チャンネルの数
-
out_channels: 出力チャネルの数。コンボリューション カーネルの数に相当します。
-
kernel_size: コンボリューションカーネルサイズ
-
歩幅: 歩幅
-
padding : パディングの数
-
拡張: 穴の畳み込みサイズ
-
グループ:グループ コンボリューション設定
-
バイアス:バイアス
nn.MaxPool2d(parameter) 2 次元信号の最大プーリング
-
kernel_size: プーリングカーネルサイズ
-
歩幅: 歩幅
-
padding : パディングの数
-
dilation: プーリングカーネル間隔サイズ
-
ceil_mode: サイズは切り上げられます
-
return_indices: プールされたピクセル インデックスを記録します。
optim.SGD (パラメーター) オプティマイザー、確率的勾配降下法
-
params: 管理するパラメータのグループ
-
lr: 初期学習率
-
motentum: 運動量係数、β
-
Weight_decay: L2 正則化係数
-
nesterov: NAG を使用するかどうか
nn.Sequential(parameters) は、ネットワーク層のセットを順番にラップします。
-
シーケンス: ネットワーク層は厳密な順序で構築されます。
-
組み込みの forward(): 組み込みの forward では、for ループを通じて順方向伝播操作が順次実行されます。
マイクロカード志祥
畳み込み層ネットワーク
上の図では、全体がトレーニング ファイルなので識別が明確になるため、前の記事の ministmodel.py を train.py に変更し、新しい ModelConv2d.py ファイルを作成します。
Conv2dNet のネットワーク構造を設定します。上図からわかるように、3 つの層を作成しました。各層の順序は、まず 3X3 コンボリューション カーネルで処理され、プールされ、アクティブ化されます。3 層の処理の後、 full 接続は入力 180 から最後の 10 まで削減されます。ここでは全接続層を 5 回使用するため、ここでの回数を減らすことができます。
ModelConv2dNet.py
import torch
import torch.nn as nn
import torch.nn.functional as F
class Conv2dNet(nn.Module):
def __init__(self):
super(Conv2dNet, self).__init__()
##源图像为1 * 28 * 28
##从一层channel转为输出5层, 卷积和是3,所以输出的宽和高就是28-3+1 = 26
##输出的图像就是 5 * 26 * 26, 然后做pooling下采样2, 变为 5 * 13 * 13
self.conv1 = nn.Sequential(
nn.Conv2d(1, 5, kernel_size=3),
nn.MaxPool2d(2),
nn.ReLU()
)
##从上层channel的5转为输出10层, 卷积和是3,所以输出的宽和高就是13-3+1 = 11
##输出的图像就是 10 * 11 * 11, 然后做pooling下采样2, 变为 10 * 5 * 5
self.conv2 = nn.Sequential(
nn.Conv2d(5, 10, kernel_size=3),
nn.MaxPool2d(2),
nn.ReLU()
)
##从上层channel的10转为输出20层, 卷积和是3,所以输出的宽和高就是5-3+1 = 3
##本层不再做池化了,所以输出的图像就是 20 * 3 * 3,
self.conv3 = nn.Sequential(
nn.Conv2d(10, 20, kernel_size=3),
nn.ReLU()
)
##经过上面的图像20 * 3 * 3 = 180,进行全连接,我们多做几层将输出层降到10
self.fc = nn.Sequential(
nn.Linear(180, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 32),
nn.ReLU(),
nn.Linear(32, 16),
nn.ReLU(),
nn.Linear(16, 10)
)
##定义损失函数
self.criterion = torch.nn.CrossEntropyLoss()
def forward(self, x):
in_size = x.size(0)
x = self.conv1(x)
x = self.conv2(x)
x = self.conv3(x)
x = x.view(in_size, -1)
x = self.fc(x)
return x
マイクロカード志祥
トレーニングファイルの修正
train.py ファイルで、作成した ModelConv2d をインポートし、変数 train_name を Conv2dNet に変更します。
次に、switch 関数に判定を追加します。Conv2dNet の場合は、直接 Conv2dNet() に戻ります。他のコードはまったく移動する必要はありません。次のステップは、トレーニングを実行して効果を確認することです。
上の図では、トレーニング結果の予測率が 98% であることがわかります。
以上
過去の素晴らしいレビュー
pyTorch の入門 (1) - Minist 手書きデータ認識トレーニングの完全に接続されたネットワーク
Android Kotlin は署名ホワイトボードを作成し、写真を保存します
超簡単な pyTorch トレーニング -> onnx モデル -> C++ OpenCV DNN 推論 (ソース コード アドレス付き)