この記事は京都大学人工知能研究会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
が設定されます。