Edited at

AutoencoderでDeconvolutionとUpSamplingの比較をしてみました

最近物体検出していたが、そこでDSSDなるものが性能いいよという記述を見つけたので、その準備として、Deconvolutionって、UpSamplingと具体的にどっちがどうなの??

ということで、Autoencoderに両方使って出てきた画像を比較してみました。

コードは以下にようなものです。

AutoEncoder / AutoEncoder_Deconv.py

【参考】

リアルタイム物体検出向けニューラルネット、SSD(Single Shot Multi Detector)及びその派生モデルの解説

DSSD : Deconvolutional Single Shot Detector(論文)

Cheng-Yang Fu, Wei Liu, Ananth Ranga, Ambrish Tyagi, Alexander C. Berg

(Submitted on 23 Jan 2017)


KerasDocumentationによれば

Decovolutionとは以下のリンクのとおりです。

Conv2DTranspose

そして、イメージが以下にありました。

ニューラルネットワークにおけるDeconvolution


使い方

モデル部分のコードは以下のとおりです。

def encoded(input_img,dim_factor):

x = Convolution2D(64, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Convolution2D(128, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
encoded = Convolution2D(8*dim_factor, (3, 3), activation='relu', padding='same')(x)
return encoded

def decoded(encoded,dim_factor):
x = Convolution2D(8*dim_factor, (3, 3), activation='relu', padding='same')(encoded)
#x = Conv2DTranspose(128, 9, 9, activation='relu', border_mode='valid')(x)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(128, (3, 3), activation='relu', padding='same')(x)
#x = Conv2DTranspose(64, 17, 17, activation='relu', border_mode='valid')(x)
x = UpSampling2D((2, 2))(x)
decoded = Convolution2D(3, (3, 3), activation='sigmoid', padding='same')(x)
return decoded

つまり、#で消している部分を入れ替えれば同じような役割で機能してくれます。

今は通常のUpSampling版というわけです。

ある意味、無理やりUpSamplingと同じサイズになるようにパラメータを合わせてみました。


結果

Deconvolution版の実行結果は以下のようになりました。

deconv_AE.gif

そして、通常のUpSampling版は以下のようになりました。

ordinary_AE.gif

両者を比較すると一目瞭然です。

UpSamplingバージョンの方が綺麗です。

ちなみに、中間層の次元は同じなので今回に限っては両者の変換の仕組みが効いていると言えそうです。

【参考】

CapsNetで遊んでみた♬~Autoencoderと比較すると~


まとめ

ということで、DSSDなどで使う場合は、UpSamplingでやってもいいように思います。

ただし、必ずしもサイズを倍にしたい場合だけではないので、Decovolutionの方がサイズの自由度が高く、こちらがフィットする場合もありそうです。