chainerでDeconvolutionの出力サイズの計算がよくわからなかったのでメモ
pytorchの方のドキュメントを漁ったら出て来ました
pytorchの場合
こちらはちゃんとドキュメントに幅と高さの計算方法を書いてくれてます
https://pytorch.org/docs/stable/nn.html#torch.nn.ConvTranspose2d
class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)
\begin{align}
H_{out} &= (H_{in} - 1)\times stride[0] - 2 \times pad[0] + ksize[0] + output\_padding[0] \\
W_{out} &= (W_{in} - 1)\times stride[1] - 2 \times pad[1] + ksize[1] + output\_padding[1]
\end{align}
chainerの場合
ドキュメントには書いていないですが、ソースコードを見るとほぼ同じであることがわかります
https://docs.chainer.org/en/stable/reference/generated/chainer.links.Deconvolution2D.html
class chainer.links.Deconvolution2D(self, in_channels, out_channels, ksize=None, stride=1, pad=0, nobias=False, outsize=None, initialW=None, initial_bias=None, *, groups=1)
\begin{align}
H_{out} &= (H_{in} - 1)\times stride[0] - 2 \times pad[0] + ksize[0] \\
W_{out} &= (W_{in} - 1)\times stride[1] - 2 \times pad[1] + ksize[1]
\end{align}
chainerはpytorchと違ってoutput_padding
がありません。
そのため、$H_{in}$とksize
が共に奇数の場合、
\begin{equation}
H_{out} = (奇数-1)\times stride[0] - 2\times pad[0] + 奇数 = 奇数
\end{equation}
より、$H_{out}$は奇数にしかなりません
$H_{out}$を偶数にしたい場合は、ksize
の方を変える必要が生じる場合がありそうです
(GANのコードとかだとdeconvolutionでconvolutionとksizeが違う場合は多々あるのでまあ良いのでは?)