Edited at

KerasのConv2DTransposeの動作について


概要

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)