深層学習

特徴マップとパディング

カーネルサイズ・ストライド・パディングから特徴マップの空間サイズを計算し、same と valid の違い、端の画素が受ける扱いを整理する。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

特徴マップの高さと幅は、入力サイズ、カーネルサイズ、ストライド、パディングの量で決まります。チャネル数とは別に空間サイズを追跡します。

画像の上に窓を置いて動かすと考えます。動かす間隔と外側の余白が、窓を置ける位置の数を決めます。

なぜ必要か

畳み込み層を重ねると、設定を見ただけでは次のテンソルの形が分かりにくくなります。stride=2 は縮小を意図した設定ですが、stride=1 でもパディングがなければカーネルの分だけ高さと幅が減ります。形状を曖昧にすると、後段の結合や残差接続でサイズが合わなくなります。

パディングは入力の外側に値を補い、カーネルを端まで置けるようにする操作です。補助値を含むため、端の出力が参照する情報の構成も変わります。

設定を変える箇所空間サイズへの主な影響
カーネルを大きくする同じ入力・パディングなら出力位置が減る
ストライドを大きくする窓の開始位置が粗くなり、出力位置が減る
パディングを増やす端まで窓を置きやすくなり、出力位置が増える

仕組み

高さ方向で、入力サイズを HinH_{\mathrm{in}}、カーネルサイズを KK、片側のパディングを PP、ストライドを SS とします。出力の高さ HoutH_{\mathrm{out}} は、カーネルが完全に収まる開始位置の数です。

Hout=⌊Hin+2P−KS⌋+1H_{\mathrm{out}} = \left\lfloor \frac{H_{\mathrm{in}} + 2P - K}{S} \right\rfloor + 1

幅方向も、入力幅 WinW_{\mathrm{in}}、カーネル KwK_w、パディング PwP_w、ストライド SwS_w で同じように計算します。床関数 ⌊⋅⌋\lfloor\cdot\rfloor があるため、割り切れない設定では端の余りを出力位置にしません。チャネル方向はこの式の対象外です。

valid はパディングなしです。32×3232\times32 の入力に 3×33\times3 カーネル、ストライド1なら、出力は 30×3030\times30 になります。同じ層を何度も重ねれば、そのたびに空間サイズが減るので、深いネットワークでは意図せず情報の解像度を失います。

same はストライド1で出力の空間サイズを入力と同じにする指定です。奇数サイズのカーネルなら、たとえば 3×33\times3 では片側1画素のパディングが対応します。一方、same は「常に入力と同じサイズ」という意味で固定的に暗記せず、フレームワークの制約も確認します。PyTorch の Conv2d では same はストライド1以外をサポートしません。

端の画素は中央の画素より参照される回数が少なくなります。3×33\times3 をパディングなしで動かすなら、中央付近の画素は複数の窓に入り得ますが、四隅の画素は角の窓にしか入りません。ゼロパディングでサイズを保つ場合も、端の窓には入力画像ではない補助値が含まれます。この差が、端の出力と中央の出力で利用できる実データ量を変えます。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
出力の高さ・幅を計算HinH_{\mathrm{in}}、KK、PP、SSを式に代入し、最後に床関数を適用パディングを片側だけ足す/+1+1を落とす
same と valid の区別valid はパディングなし、same はストライド1で空間サイズを保つvalid を「有効な画素だけを残す別の演算」と考える
層を重ねた形状の追跡各層の出力を次の入力として、層ごとに再計算最初の入力サイズに全層の設定をまとめて適用する
端の画素の扱いパディングなしでは参照回数が少なく、パディングありでは補助値を含むすべての画素が同じ回数、同じ種類の値で参照されるとする

実装で確かめる

式をコードにすると、設定変更の影響を確認できます。下の関数は高さ方向だけを計算しています。same 相当の 3×33\times3・ストライド1では 3232 が保たれ、valid では 3030 になります。

import numpy as np

def out_size(n, k, p, s):
    return (n + 2 * p - k) // s + 1

cases = [(32, 3, 0, 1), (32, 3, 1, 1), (32, 3, 0, 2)]
for case in cases:
    print(case, out_size(*case))

実行結果は (32, 3, 0, 1) 30、(32, 3, 1, 1) 32、(32, 3, 0, 2) 15 です。偶数カーネルや別ストライドでは same の扱いが単純でないため、ライブラリの仕様と実際の形状を確認します。

取り違えやすいもの

用語切り分け
特徴マップの空間サイズ高さ・幅のこと。カーネル、ストライド、パディングで変化する
チャネル数フィルタの本数に対応する別の軸。空間サイズの式には入らない
validパディングなし。ストライド1ならカーネル分だけ空間サイズが縮む
sameストライド1で入力と同じ空間サイズにするパディング指定
ストライド窓を動かす間隔。大きくすると、パディングが同じでも出力位置が減る

想起チェック

出力サイズを決める4つの値は何か

入力サイズ、カーネルサイズ、片側パディング、ストライドです。高さと幅はそれぞれの方向で計算します。

`valid` と `same` の違いは何か

valid はパディングなし、same は PyTorch ではストライド1で入力と同じ空間サイズにする指定です。

端の画素が中央より参照されにくい理由は何か

パディングなしでは、端の画素を含むカーネルの置き場所が中央より少ないためです。パディングありでも、端の窓は補助値を含み、実データの参照量が中央と異なります。

出典