#05 人工知能入門 CNN画像認識
CNNの全体構造——畳み込みを積み重ねる
CNN全体のブループリント
これまで「畳み込み」「プーリング」「活性化関数」を個別に学びました。それらを組み合わせたCNN全体の構造を見ていきましょう。
基本的なパターンは非常にシンプルです:
[Conv → ReLU → Pooling] を繰り返す
↓
全結合層(FC層)
↓
出力(分類結果)
基本ブロック: Conv → ReLU → Pooling
この3つはセットで使われます。
特徴マップ
↓
[Convolution] ← フィルターで特徴を検出
↓
[ReLU] ← 負の値を0にする(非線形性を追加)
↓
[MaxPooling] ← サイズを半分に圧縮
↓
次のブロックへ
なぜこの順番かというと:
- Conv で「ここにエッジがある」という信号を作る
- ReLU で「反応していない(弱い)場所」を0にする
- Pooling で「位置ずれに強くしつつ」サイズを縮小する
LeNet風のシンプルな構成例
LeNetは1998年にLeCun氏が提案した、CNN元祖とも言えるネットワークです。手書き数字認識(MNIST)のために作られました。
入力: 32×32×1(モノクロ画像)
Conv1: カーネル5×5、フィルター6個、パディングなし
出力: 28×28×6
ReLU1
AvgPool1: 2×2、ストライド2
出力: 14×14×6
Conv2: カーネル5×5、フィルター16個、パディングなし
出力: 10×10×16
ReLU2
AvgPool2: 2×2、ストライド2
出力: 5×5×16
Flatten(平坦化): 5×5×16 = 400次元のベクトルに
FC1: 400 → 120
ReLU3
FC2: 120 → 84
ReLU4
FC3: 84 → 10(0〜9の10クラス)
Softmax
サイズ変化の計算
Conv後のサイズ計算式:
出力サイズ = (入力サイズ + 2×パディング - カーネルサイズ) / ストライド + 1
LeNetの各層でサイズを確認:
入力: 32×32
Conv1(カーネル5、パディング0、ストライド1):
(32 + 0 - 5) / 1 + 1 = 28
Pool1(カーネル2、ストライド2):
28 / 2 = 14
Conv2(カーネル5、パディング0、ストライド1):
(14 + 0 - 5) / 1 + 1 = 10
Pool2(カーネル2、ストライド2):
10 / 2 = 5
Flatten(平坦化)
畳み込み部分が終わると、3次元の特徴マップ(高さ×幅×チャンネル)を1次元のベクトルに変換します。
5×5×16 の特徴マップ
↓ Flatten
400次元のベクトル [x1, x2, x3, ..., x400]
この後、通常の全結合層(DNN基礎で学んだもの)につながります。全結合層が「特徴を組み合わせて最終判断を行う」部分です。
パラメータ数の比較
LeNetのパラメータ数を計算してみましょう:
| 層 | パラメータ数 | 計算式 |
|---|---|---|
| Conv1 | 156 | 5×5×1×6 + 6 |
| Conv2 | 2,416 | 5×5×6×16 + 16 |
| FC1 | 48,120 | 400×120 + 120 |
| FC2 | 10,164 | 120×84 + 84 |
| FC3 | 850 | 84×10 + 10 |
| 合計 | 約6万 |
たった6万のパラメータで手書き数字を99%以上の精度で認識できます。全結合だけのネットワークと比べると、桁違いに効率的です。
現代のCNNとの違い
LeNetは小さな画像向けです。現代のCNN(例: ResNet-50)は:
入力: 224×224×3(大きいカラー画像)
Conv→BN→ReLU→Pooling → [Residual Block × 16] → GAP → FC
パラメータ数: 約2,500万
構造は複雑になりましたが、基本は同じです。「ConvとReLUとPoolingを積み重ね、最後に全結合で分類する」という骨格は変わっていません。
まとめ
- CNNの基本は「Conv → ReLU → Pooling」のブロックを繰り返すこと
- 最後にFlatten + 全結合層 + Softmaxで分類結果を出す
- サイズ計算式: (入力 + 2×パディング - カーネル) / ストライド + 1
- LeNetは6万パラメータで手書き数字を高精度で認識できる効率的なモデル
- 現代のCNNも基本構造は同じで、深さ・幅・工夫が加わっている
次回は、様々なCNNアーキテクチャで共通して使われる「特徴抽出エンジン」——バックボーンの概念を学びます。