我一直在遵循Keras文档来构建CNN自动编码器https://blog.keras.io/building-autoencoders-in-keras.html。
from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K
input_img = Input(shape=(28, 28, 1)) # adapt this if using `channels_first` image data format
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
# at this point the representation is (4, 4, 8) i.e. 128-dimensional
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
我注意到它在解码层中使用Conv2D,而不是Conv2DTranspose。但其他一些文章解释了使用Conv2DTranspose代替Upsampling2D和Conv2D的CNN自动编码器。我看到了几个与Conv2DTranspose本身有关的问题。但我还没有找到问题的答案。
我的问题是我可以使用Conv2DTranspose而不是Upsampling2D和Conv2D层。如果是这样,为什么作者自己(Keras文档(没有使用它?这有什么不同吗?
转置卷积通常会导致被称为Checkerboard artifacts
的伪影——相邻的小正方形很容易相互区分。这些使得人类很容易从真实图像中识别出假图像。
你可以阅读这篇文章了解更多信息。
简而言之,使用Resizing + Conv2D
而不是Conv2dTranspose
可以最大限度地减少这些棋盘假象。