LeNet5読み取り論文

以下に示す従来のパターン認識方法は、一般的に二つの部分、特徴抽出モジュールの第一の部分、第2の部分分類モジュールを含みます。特徴抽出モジュールは、通常、いくつかの基本的な特徴を抽出し、タスクは無関係であり、このモジュールは、通常、人工的に設計されています。分類モジュールは、タスクのために通常で、トレーニング可能です。手動による方法への依存は、主に従来の設計では、有効な特徴を抽出する抽出モジュールを備え、そして異なるタスクのために再設計する必要ができています。

ここに画像を挿入説明

以前に比べて優位性

まず、必要なより少ない畳み込みFCパラメータと比較。
第二に、FCは、空間情報を失い、畳み込み演算をよく保存することができます。

ネットワークアーキテクチャ

ここに画像を挿入説明
完全層と畳み込み層を接続された3つの層を含むLeNet5ネットワーク。
入力 32 × 32 32 \回32 の画像。
画像の形状を入力します。 1 × 32 × 32 1 \回32 \回32

1、畳み込み層C1

kenelサイズ: 5 × 5 5 \回5
#kernel:6
畳込み形状後の後: 6 × 28 × 28 6 \回28 \回28
#パラメータ:* 6。(5。5。= 156(含むバイアス)1. 1 +)。

図2に示すように、下層をS2(平均細胞層)を採取し

kenelサイズ: 2 × 2 2 \回2
形状をダウンサンプリングした後: 6 × 14 × 14 6 \回14 \回14
現在一般的に最大のプールを達成するために使用されます。
ここに画像を挿入説明

3、畳み込み層C3

kenelサイズ: 5 × 5 5 \回5
#kernel:16
畳み込み形状後の後: 16 × 10 × 10 16 \回10 \回10
論文は第6特徴マップマップS2で述べた3つの隣接するフィーチャに接続され、特徴マップマップS2の6次の4つの隣接するフィーチャに接続され、次いで、次3特徴マップ及びS2
隣接する4つの特徴マップには、最後の特徴マップに接続されておらず、S2は、特徴マップの全てに接続されています。
#パラメータ:* 6。(5。5+ 6 * 3 + 1)。(5。5。+ 3 * 4 + 1)。(5。5。+ 1 * 4 + 1)。(5。5。= 1516 6. 1 +)。

図4に示すように、ダウンサンプリング層S4(平均細胞層)

kenelサイズ: 2 × 2 2 \回2
形状をダウンサンプリングした後: 16 × 5 × 5 16 \回5 \ 5倍
現在一般的に最大のプールを達成するために使用されます。

図5に示すように、畳み込み層C5

kenelサイズ: 5 × 5 5 \回5
#kernel:120
入り組んだ形状の後: 120 × 1 × 1 120 \回1 \回1
#パラメータ:120 *(5516 + 1)= 48120

図6に示すように、全ての接続層F6

F6にMLP(多層パーセプトロン、MLP)に層相当隠し、そこに84個のノードがF6はシグモイド関数を使用するので、84 *(1 + 120)= 10164パラメータがある、であるが、現在一般に達成しますReLU機能付き。

7、出力層

完全に接続された層は、10個のノードの合計は、ラジアル基底関数(RBF)ネットワーク接続を使用します。

コード

import torch
from torch import nn

class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2),
            # nn.BatchNorm2d(6),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5),
            # nn.BatchNorm2d(16),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.fc = nn.Sequential(
            nn.Linear(16 * 5 * 5, 120),
            nn.Linear(120, 84),
            nn.Linear(84, 10)
        )

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.shape[0], -1)
        x = self.fc(x)
        return x

if __name__ == '__main__':
    x = torch.rand(8,1,28,28)
    net = LeNet5()
    y = net(x)
    print(y.shape)
    print(y)

参照

1. LeNet5論文や理解

公開された93元の記事 ウォンの賞賛0 ビュー20000 +

おすすめ

転載: blog.csdn.net/Dream_xd/article/details/104563874