コンピュータービジョン

畳み込み層 たたみこみそう

畳み込み層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で、空間的な情報は変えずにチャンネル数だけ変換します。

  • 次元削減:チャンネル数を減らして計算コスト削減(ボトルネック構造)
  • 非線形性の追加:全結合層と同等の働き
  • GoogLeNetやResNetのボトルネックブロックで多用

関連用語