畳み込み層 たたみこみそう
畳み込み層Convolutional LayerCNNフィルタカーネル特徴抽出
畳み込み層について教えて
簡単に言うとこんな感じ!
畳み込み層は「小さなフィルタ(虫眼鏡)を画像全体にスライドさせながら、特定のパターン(エッジや形)を検出する層」だよ。1つのフィルタが「縦線検出器」、別のフィルタが「斜め線検出器」……という感じで、多数のフィルタが異なる特徴を同時に探すんだ!
畳み込み層とは
畳み込み層(Convolutional Layer) は、CNN(畳み込みニューラルネットワーク)の中心的な構成要素で、フィルタ(カーネル)と入力データの内積を計算しながら画像全体をスキャンし、特徴を抽出する層です。
通常の全結合層が入力の全要素を全パラメータと接続するのに対し、畳み込み層は局所的な接続(Local Connectivity) とパラメータ共有(Weight Sharing) を採用しています。3×3フィルタなら9個のパラメータだけで画像全体をスキャンでき、パラメータ数を大幅に削減できます。
複数のフィルタを使うことで、エッジ・テクスチャ・形・模様など様々な特徴を並行して抽出できます。フィルタの数は深い層ほど増やすのが一般的で(例:64→128→256)、より複雑な特徴を表現できるようになります。
畳み込み演算のイメージ
入力(5×5) フィルタ(3×3) 出力の1要素
┌─────────┐ ┌───────┐
│1 2 1 0 0│ │1 0 1 │
│0 1 2 1 0│ × │0 1 0 │ = 合計(要素積の和)
│1 0 1 2 1│ │1 0 1 │
│0 1 0 1 2│ └───────┘
│1 2 1 0 1│
└─────────┘
import torch.nn as nn
# 畳み込み層の定義
conv = nn.Conv2d(
in_channels=3, # 入力チャンネル数(RGB画像なら3)
out_channels=64, # フィルタ数 = 出力チャンネル数
kernel_size=3, # フィルタサイズ(3×3)
stride=1, # スライドの移動量
padding=1 # 周囲への0埋め(サイズを維持)
)
# パラメータ数: 3 × 64 × 3 × 3 + 64(バイアス) = 1,792
歴史と背景
- 1989年:LeCunが畳み込み層を使ったLeNetで手書き数字を学習
- 2012年:AlexNetがGPUを活用し多数の畳み込み層を重ねてImageNetを制覇
- 2014年:VGGが「3×3フィルタを深く重ねる」スタイルを確立。現在も広く使われる
- 現在:ConvNeXtなど最新の設計でも畳み込み層は中核的な役割を維持
畳み込み層のパラメータ
| パラメータ | 意味 | 典型的な値 |
|---|---|---|
| kernel_size | フィルタの大きさ | 3×3(最も一般的)、1×1、5×5 |
| out_channels | フィルタの枚数 | 32・64・128・256・512 |
| stride | フィルタをいくつ飛ばしてスライドするか | 1(通常)、2(ダウンサンプリング) |
| padding | 入力の周囲に加える0の層数 | 1(3×3カーネルのサイズ維持) |
1×1畳み込みの用途
1×1畳み込みはフィルタサイズ1×1で、空間的な情報は変えずにチャンネル数だけ変換します。
関連用語
- CNN(畳み込みニューラルネットワーク) — 畳み込み層を中心とした全体構造
- フィルタ / カーネル(CNN) — 畳み込み層が使う検出器
- 特徴マップ — 畳み込み層の出力
- ストライド / パディング — 畳み込みの動作を制御するパラメータ
- プーリング層 — 畳み込み層と組み合わせる空間縮小の層