ひとことで言うと
特徴マップの高さと幅は、入力サイズ、カーネルサイズ、ストライド、パディングの量で決まります。チャネル数とは別に空間サイズを追跡します。
画像の上に窓を置いて動かすと考えます。動かす間隔と外側の余白が、窓を置ける位置の数を決めます。
なぜ必要か
畳み込み層を重ねると、設定を見ただけでは次のテンソルの形が分かりにくくなります。stride=2 は縮小を意図した設定ですが、stride=1 でもパディングがなければカーネルの分だけ高さと幅が減ります。形状を曖昧にすると、後段の結合や残差接続でサイズが合わなくなります。
パディングは入力の外側に値を補い、カーネルを端まで置けるようにする操作です。補助値を含むため、端の出力が参照する情報の構成も変わります。
| 設定を変える箇所 | 空間サイズへの主な影響 |
|---|---|
| カーネルを大きくする | 同じ入力・パディングなら出力位置が減る |
| ストライドを大きくする | 窓の開始位置が粗くなり、出力位置が減る |
| パディングを増やす | 端まで窓を置きやすくなり、出力位置が増える |
仕組み
高さ方向で、入力サイズを 、カーネルサイズを 、片側のパディングを 、ストライドを とします。出力の高さ は、カーネルが完全に収まる開始位置の数です。
幅方向も、入力幅 、カーネル 、パディング 、ストライド で同じように計算します。床関数 があるため、割り切れない設定では端の余りを出力位置にしません。チャネル方向はこの式の対象外です。
valid はパディングなしです。 の入力に カーネル、ストライド1なら、出力は になります。同じ層を何度も重ねれば、そのたびに空間サイズが減るので、深いネットワークでは意図せず情報の解像度を失います。
same はストライド1で出力の空間サイズを入力と同じにする指定です。奇数サイズのカーネルなら、たとえば では片側1画素のパディングが対応します。一方、same は「常に入力と同じサイズ」という意味で固定的に暗記せず、フレームワークの制約も確認します。PyTorch の Conv2d では same はストライド1以外をサポートしません。
端の画素は中央の画素より参照される回数が少なくなります。 をパディングなしで動かすなら、中央付近の画素は複数の窓に入り得ますが、四隅の画素は角の窓にしか入りません。ゼロパディングでサイズを保つ場合も、端の窓には入力画像ではない補助値が含まれます。この差が、端の出力と中央の出力で利用できる実データ量を変えます。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 出力の高さ・幅を計算 | 、、、を式に代入し、最後に床関数を適用 | パディングを片側だけ足す/を落とす |
same と valid の区別 | valid はパディングなし、same はストライド1で空間サイズを保つ | valid を「有効な画素だけを残す別の演算」と考える |
| 層を重ねた形状の追跡 | 各層の出力を次の入力として、層ごとに再計算 | 最初の入力サイズに全層の設定をまとめて適用する |
| 端の画素の扱い | パディングなしでは参照回数が少なく、パディングありでは補助値を含む | すべての画素が同じ回数、同じ種類の値で参照されるとする |
実装で確かめる
式をコードにすると、設定変更の影響を確認できます。下の関数は高さ方向だけを計算しています。same 相当の ・ストライド1では が保たれ、valid では になります。
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で入力と同じ空間サイズにする指定です。
端の画素が中央より参照されにくい理由は何か
パディングなしでは、端の画素を含むカーネルの置き場所が中央より少ないためです。パディングありでも、端の窓は補助値を含み、実データの参照量が中央と異なります。