LoginSignup
0
0

【PyTorch】conv_transpose2dの設定

Last updated at Posted at 2023-12-04

この記事は京都大学人工知能研究会KaiRA Advent Calendar 5日目の記事です。

conv2dのカスタム関数を作成している時にbackward処理でconv_transpose2dをどう使えば良いか困ったので、conv_transpose2dの仕様を備忘録としてまとめます。

公式ドキュメントはこちら。

動作イメージ

ConvTranspose2dのドキュメントにも記載の通り、conv_transpose2dconv2dの勾配計算に使えます。すなわち、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の勾配を計算できます。この時、stridepaddingdilationが両方で同じ値に設定されている必要があります。また、conv2dを計算する時にstrideが1より大きい場合には端ピクセルが切り捨てられる場合があるため、そうした場合に勾配のサイズが合うようにoutput_paddingが設定されます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0