1. はじめに
GANの生成の際などに用いるPytorchのConvTranspose2dの使い方について、
色々と調べたりしましたので、簡単にまとめておこうと思います。
2. ConvTranspose2Dのパラメータ
Conv2dの逆変換を行うConvTranspose2Dは、その変換前のConv2Dの際のパラメータと同じものを用いるようです。
Conv2dの感覚でConvTranspose2dを見ると、パディングのパラメータが0でないように見えます。しかし、ConvTranpose2dのパディングのパラメータは、Conv2dの際にパディングをしているかどうかによって決定します。他にも例を見たい方はこちらのサイトをご参照ください。
3. 出力サイズの導出
出力サイズは以下の数式で導き出されます。
\begin{align}
&Input : (N, C_{in}, H_{in}, W_{in}) \; or \; (C_{in}, H_{in}, W_{in})\\
&Output : (N, C_{out}, H_{out}, W_{out})\; or \; (C_{out}, H_{out}, W_{out}), where
\end{align}
\begin{align}
H_{out} &= (H_{in}-1) \times stride[0] - 2 \times padding[0] + dilation[0] \times (kernel\_size[0]-1) + output\_padding[0] + 1\\
W_{out} &= (W_{in}-1) \times stride[1] - 2 \times padding[1] + dilation[1] \times (kernel\_size[1]-1) + output\_padding[1] + 1
\end{align}
この数式を単体で理解するのは難しいですが、Conv2dの以下の数式の逆変換と考えると理解しやすいと思います。
H_{out} = \lfloor \frac{H_{in} + 2 \times padding[0] - dilation[0] \times (kernel\_size[0]-1) -1}{stride[0]} + 1 \rfloor\\
W_{out} = \lfloor \frac{W_{in} + 2 \times padding[1] - dilation[1] \times (kernel\_size[1]-1) -1}{stride[1]} + 1 \rfloor
このとき、output_paddingだけはConvTranspose2dでしか出現しない変数となります。
これはoutput shapeをコントロールするように、出力の片側に追加するもののようです。
4.まとめ
今回はPytorchのConvTranspose2dのパラメータ設定について、覚書程度にまとめました。
自分でGANやVAEのネットワーク構築をするときがあれば、使えればと思います。