以下に示す従来のパターン認識方法は、一般的に二つの部分、特徴抽出モジュールの第一の部分、第2の部分分類モジュールを含みます。特徴抽出モジュールは、通常、いくつかの基本的な特徴を抽出し、タスクは無関係であり、このモジュールは、通常、人工的に設計されています。分類モジュールは、タスクのために通常で、トレーニング可能です。手動による方法への依存は、主に従来の設計では、有効な特徴を抽出する抽出モジュールを備え、そして異なるタスクのために再設計する必要ができています。
以前に比べて優位性
まず、必要なより少ない畳み込みFCパラメータと比較。
第二に、FCは、空間情報を失い、畳み込み演算をよく保存することができます。
ネットワークアーキテクチャ
完全層と畳み込み層を接続された3つの層を含むLeNet5ネットワーク。
入力
の画像。
画像の形状を入力します。
1、畳み込み層C1
kenelサイズ:
#kernel:6
畳込み形状後の後:
#パラメータ:* 6。(5。5。= 156(含むバイアス)1. 1 +)。
図2に示すように、下層をS2(平均細胞層)を採取し
kenelサイズ:
形状をダウンサンプリングした後:
現在一般的に最大のプールを達成するために使用されます。
3、畳み込み層C3
kenelサイズ:
#kernel:16
畳み込み形状後の後:
論文は第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サイズ:
形状をダウンサンプリングした後:
現在一般的に最大のプールを達成するために使用されます。
図5に示すように、畳み込み層C5
kenelサイズ:
#kernel:120
入り組んだ形状の後:
#パラメータ: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論文や理解