ストライド / パディング すとらいど / ぱでぃんぐ
ストライドパディングCNN畳み込みダウンサンプリング出力サイズ
ストライド / パディングについて教えて
簡単に言うとこんな感じ!
ストライドは「フィルタを何ピクセルずつずらすか」の設定で、大きくすれば出力が小さくなる(ダウンサンプリング)。パディングは「画像の周囲に0を追加する」ことで、畳み込みで端の情報が消えるのを防ぐよ。この2つで出力サイズをコントロールするんだ!
ストライド / パディングとは
ストライド(Stride) は、フィルタを入力上でスライドさせるときの移動幅のことです。デフォルトは1(1ピクセルずつ移動)ですが、2にすると出力サイズが約半分になります。プーリング層の代わりにストライド付き畳み込みでダウンサンプリングする現代的なCNNが増えています。
パディング(Padding) は、入力の周囲に値(通常は0)を追加する処理です。パディングなしで畳み込みをすると出力サイズが入力より小さくなり、端の情報が内部と比べて少ない回数しか使われません。padding=1 を設定すると、3×3フィルタで入力と同じ出力サイズを維持できます(Same Padding)。
これらを組み合わせることで、出力の特徴マップのサイズを設計者が意図通りにコントロールできます。
出力サイズの計算式
出力サイズ = (入力サイズ + 2×パディング - カーネルサイズ) ÷ ストライド + 1
| 入力サイズ | カーネル | パディング | ストライド | 出力サイズ |
|---|---|---|---|---|
| 224 | 3 | 1 | 1 | 224 (Same) |
| 224 | 3 | 0 | 1 | 222 (サイズ縮小) |
| 224 | 3 | 1 | 2 | 112 (ダウンサンプリング) |
| 224 | 7 | 3 | 2 | 112 (ResNet第1層) |
import torch.nn as nn
# 典型的な設定例
# Same Padding(サイズ維持)
conv_same = nn.Conv2d(in_channels=64, out_channels=64,
kernel_size=3, stride=1, padding=1)
# ダウンサンプリング(stride=2でサイズ半分)
conv_down = nn.Conv2d(in_channels=64, out_channels=128,
kernel_size=3, stride=2, padding=1)
歴史と背景
- LeNet時代:パディングなし、stride=1が基本。小さい入力で使用
- AlexNet(2012):stride=4の大きなストライドで計算量を削減
- VGG(2014):3×3+padding=1の組み合わせを統一。一貫したサイズ管理
- ResNet(2015年)以降:stride=2の畳み込みでプーリングを代替する設計が普及
パディングの種類
| 種類 | 内容 | 使われ方 |
|---|---|---|
| ゼロパディング(Valid→Same) | 周囲に0を追加 | 最もよく使われる。PyTorchのデフォルト |
| リフレクションパディング | 境界値を鏡像で補完 | スタイル変換、画像生成 |
| リプリケーションパディング | 端の値をそのままコピー | 端のアーティファクトを減らしたい場合 |
関連用語
- 畳み込み層 — ストライドとパディングを設定する層
- フィルタ / カーネル(CNN) — ストライドで移動するフィルタ
- プーリング層 — ストライド付き畳み込みと代替関係
- 特徴マップ — ストライド・パディングで決まる出力