概要
Conv2DTranspose(ChainerではDeconvolution)の動作が分かりにくいので、どうやって動作しているのかをまとめる記事。
Transpose Convolutionとは
Upsamplingするときに使用されるレイヤー。
和訳すると「転置畳み込み」。なぜ転置なのかは以下のサイトで分かりやすく説明されている。
Up-sampling with Transposed Convolution
また以下のリンク先で動作のアニメーションが見れる。
Convolution arithmetic
出力shape計算式
Convolution2Dの出力shape計算式はTensorFlowの公式ドキュメントに式が書いてある。
TransposeConvolution2Dの出力shape計算式については、how to calculate the output shape of conv2d_transpose?に書かれている。
以下上記サイトに記載されている数式
Convolution2Dの出力shape計算式
-
Padding == SAME
の場合
output\_shape[i] = ceil(input\_shape[i] \div strides[i])
-
Padding == VALID
の場合
output\_shape[i] = ceil((input\_shape[i] - (filter\_shape[i]-1) \times dilation\_rate[i]) \div strides[i]).
TransposeConv2Dの出力shape計算式
-
Padding == SAME
の場合
output\_shape[i] = input\_shape[i] \times strides[i]
-
Padding == VALID
の場合
output\_shape[i] = (input\_shape[i] - 1) \times strides[i] + filter\_shape[i]
Conv2DTranspose設定パラメータ
Params | Value |
---|---|
filter_shape | 畳み込みをするfilterのshape |
strides | 畳み込みの縦と横のストライド |
padding | VALID or SAME |
Conv2Dのstrides
はfilterをどれくらいずらすか、というパラメータだったが、Conv2DTransposeでは入力画像の画素間の間隔を表している。デフォルトはstrides=(1,1)
になっていて、これは画素間に空白がないことを示している。
strides=(2,2)
を設定すると入力画像の画素間に1つのパディングが埋め込まれる。
padding
は上記した出力shapeの計算式を切り替える役割を持っている。
Conv2DTransposeの動作図
設定パラメータと、実際にフィルターと入力画像がどうやって重なっているのか図示する。
赤の点線がフィルターを、青の正方形が入力画像を表している。
Params | Value |
---|---|
input_shape | (2,2) |
filter_shape | (2,2) |
strides | (1,1) |
padding | VALID |
output_shape | (3,3) |
Params | Value |
---|---|
input_shape | (2,2) |
filter_shape | (2,2) |
strides | (1,1) |
padding | SAME |
output_shape | (2,2) |
Params | Value |
---|---|
input_shape | (2,2) |
filter_shape | (2,2) |
strides | (2,2) |
padding | SAME |
output_shape | (4,4) |
Params | Value |
---|---|
input_shape | (2,2) |
filter_shape | (4,4) |
strides | (2,2) |
padding | SAME |
output_shape | (4,4) |
Params | Value |
---|---|
input_shape | (2,2) |
filter_shape | (4,4) |
strides | (2,2) |
padding | VALID |
output_shape | (6,6) |