概要
CNNとは、Convolutional Neural Networkの略で、主に画像処理やパターン認識に用いられる深層学習の一種です。構造としては、畳み込み層とプーリング層を持ちます。以下では、畳み込み層とプーリング層について解説します。
- 畳み込み層
入力データの特徴を学習する層です。全結合層とは異なり、2次元のデータを入力とすることが出来るので、線や角などの2次元的な特徴を検出したりすることに優れています。畳み込みフィルターの値を変えることで検出したい形状を変化させることができます。学習を行うと、フィルターの値は自動的に変わり、パターンを認識するために必要なフィルターに大きな重みがかけらえるようになります。
ここで、人間の顔を入力データとして、学習を行った際のフィルターの変化について紹介をします。
下の画像は、2層目のフィルターから形成された図です。人間の顔の目や鼻などの細かい特徴を示していることがわかります。

下の画像は、3層目のフィルターから形成された図です。人間の顔の全体をよく表しており、より高次な概念を獲得していると言えます。

(参照:https://cims.nyu.edu/~rajeshr/papers/icml09-ConvolutionalDeepBeliefNetworks.pdf)
- プーリング層
プーリング層を加えることで以下のメリットがあります。- 畳み込み層が抽出した特徴のずれを平滑化
着目したい特徴には、入力データごとにずれがあります。このずれを平滑化する働きがあります。 - 計算量の削減
特徴マップのサイズを削減することになるので、計算量を抑えることが出来ます。 - 特徴の位置依存性の低下
入力データ間で特徴となる箇所の位置が多少異なっていても、プーリング処理内で同じような出力を示すことになります。そのため、ある程度、画像内での特徴の位置が変化しても、モデルには影響が出にくくなります。 - 耐ノイズ性向上
プーリング処理では、対象範囲内で平均をとるので、ノイズが加わった場合でも、識別能力に大きな影響を与えないことが可能になります。
- 畳み込み層が抽出した特徴のずれを平滑化
以下に、PyTorchを使用してCNNを実装する例を示します:
- 必要なライブラリのインポート:
import torch
import torch.nn as nn
import torch.nn.functional as F
- CNNモデルの定義:
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(64 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = F.relu(self.conv2(x))
x = self.pool(x)
x = x.view(-1, 64 * 7 * 7)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
- モデルのインスタンス化と入力データの生成:
model = SimpleCNN()
input_data = torch.randn(1, 1, 28, 28)
- モデルの実行と出力の確認:
output = model(input_data)
print(output.shape) # 出力: torch.Size([1, 10])
このコードは、MNIST手書き数字分類タスク(28×28ピクセルの画像を10クラスに分類)に適したCNNモデルを定義しています。モデルの構造は適切で、入力から出力まで正しく処理されています。出力のシェイプ[1, 10]は、バッチサイズ1で10クラスの確率分布を表しており、期待通りの結果です。
このコードでは、MNIST手書き数字分類タスク向けの簡単なCNNを実装しています。モデルは2つの畳み込み層、2つのプーリング層、そして2つの全結合層で構成されています。