pyTorch 入門 (2) - 一般的なネットワーク層関数と畳み込みニューラル ネットワークのトレーニング

他の人からより良く学び、

より良いものになりますように。

—— 「ウェイカ・ジーシャン」

a7fd2b6bd110dd976a563812a301ac2e.jpeg

この記事の長さは 17309ワードで、読むのにかかる時間は 5分です。

序文

前回の記事「pyTorch 入門 (1) - Minist 手書きデータ認識トレーニングの完全接続ネットワーク」では、完全接続層とトレーニング ファイルを構築し、最も単純な Minist トレーニングを実行し、最終的なトレーニング結果は 97% に達しました。より一般的に使用される API および pyTorch ネットワーク層の畳み込み層

b7925ddc6f1aaceeb8cbc701edc55bc1.png

# 共通のネットワーク層機能
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 ループを通じて順方向伝播操作が順次実行されます。

2437680ef22d4d7537b59a4341b833f2.png

マイクロカード志祥

畳み込み層ネットワーク

dcaa1822c6fe5840b509139b717f72df.png

上の図では、全体がトレーニング ファイルなので識別が明確になるため、前の記事の ministmodel.py を train.py に変更し、新しい ModelConv2d.py ファイルを作成します。

9fa417e0f27c6b6f28b299792c45c48d.png

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

マイクロカード志祥

トレーニングファイルの修正

f15c739582e5eaccf1003ba649931a7a.png

train.py ファイルで、作成した ModelConv2d をインポートし、変数 train_name を Conv2dNet に変更します。

adca1edf14c7ff56ff6ed4fbaafb3cd4.png

次に、switch 関数に判定を追加します。Conv2dNet の場合は、直接 Conv2dNet() に戻ります。他のコードはまったく移動する必要はありません。次のステップは、トレーニングを実行して効果を確認することです。

8393201f1523fefd3e3885fe9b696598.png

上の図では、トレーニング結果の予測率が 98% であることがわかります。

以上

5c1aae10436d49c11d5640b1ad44112d.png

be77c5ae099d94c5269436de6d99ef27.png

過去の素晴らしいレビュー

64c9c2189f50786645cb61d3d2a11de3.jpeg

pyTorch の入門 (1) - Minist 手書きデータ認識トレーニングの完全に接続されたネットワーク

 

2f9157b5c2ca69cee3e57d2092123a5e.jpeg

Android Kotlin は署名ホワイトボードを作成し、写真を保存します

 

bb7ee24a4ea0a3cdbc5a02fcb5841770.jpeg

超簡単な pyTorch トレーニング -> onnx モデル -> C++ OpenCV DNN 推論 (ソース コード アドレス付き)

おすすめ

転載: blog.csdn.net/Vaccae/article/details/128195856