この記事は京都大学人工知能研究会KaiRA Advent Calendar 5日目の記事です。
conv2dのカスタム関数を作成している時にbackward処理でconv_transpose2dをどう使えば良いか困ったので、conv_transpose2dの仕様を備忘録としてまとめます。
公式ドキュメントはこちら。
動作イメージ
ConvTranspose2dのドキュメントにも記載の通り、conv_transpose2dはconv2dの勾配計算に使えます。すなわち、y = conv2d(x, w)とした時にxの勾配はconv_transpose2d(y.grad, w)で計算できます。
y = conv_transpose2d(x, w)とした時の動作は以下のようになります。左側がx、真ん中がw、右側がyです。xの赤ピクセルにwの青ピクセルをかけた値がyの緑ピクセルに足されていきます。
以下設定パラメータについてまとめます。
stride
出力先の座標をstrideの数ずつスライドさせます。デフォルトでは1です。
y = conv_transpose2d(x, w, stride=2)とした時の動作は以下のようになります。
padding
計算結果から、padding分だけ切り取られます。デフォルトでは0です。
y = conv_transpose2d(x, w, stride=2, padding=1)とした時の動作は以下のようになります。出力は中央の4ピクセルだけになります。
output_padding
計算結果に対して、右側と下側にzero paddingを行います。デフォルトでは0です。
y = conv_transpose2d(x, w, stride=2, output_padding=1)とした時の動作は以下のようになります。paddingも1以上に指定した場合は、output_paddingが先に適用されます。
dilation
出力先の座標がdilation飛ばしになります。デフォルトでは1です。
y = conv_transpose2d(x, w, dilation=2)とした時の動作は以下のようになります。
conv2dとの対応
(ドキュメントにも書いていることですが…)
冒頭にも述べた通り、y = conv2d(x, w)とした時にconv_transpose2d(y.grad, w)としてxの勾配を計算できます。この時、stride、padding、dilationが両方で同じ値に設定されている必要があります。また、conv2dを計算する時にstrideが1より大きい場合には端ピクセルが切り捨てられる場合があるため、そうした場合に勾配のサイズが合うようにoutput_paddingが設定されます。