为什么自动编码器的Keras文档示例使用Conv2D而不是Conv2DTranspose

为什么自动编码器的Keras文档示例使用Conv2D而不是Conv2DTranspose,keras,conv-neural-network,autoencoder,tf.keras,deconvolution,Keras,Conv Neural Network,Autoencoder,Tf.keras,Deconvolution,我一直在遵循Keras文档来构建CNN自动编码器 我注意到它在解码层使用Conv2D而不是conv2dtranpse。但其他一些文章解释了CNN自动编码器使用Conv2DTranspose代替Upsampling2D和Conv2D。我已经看到了几个与Conv2DTranspose本身有关的问题。但我还没有找到我问题的答案 我的问题是我是否可以使用Conv2DTranspose而不是上采样2D和Conv2D层。如果是这样,为什么作者自己没有使用它呢?这有什么区别吗?转置卷积通常会导致称为棋盘伪影

我一直在遵循Keras文档来构建CNN自动编码器

我注意到它在解码层使用Conv2D而不是conv2dtranpse。但其他一些文章解释了CNN自动编码器使用Conv2DTranspose代替Upsampling2D和Conv2D。我已经看到了几个与Conv2DTranspose本身有关的问题。但我还没有找到我问题的答案


我的问题是我是否可以使用Conv2DTranspose而不是上采样2D和Conv2D层。如果是这样,为什么作者自己没有使用它呢?这有什么区别吗?

转置卷积通常会导致称为棋盘伪影的伪影——相邻的小正方形很容易彼此区分。这使得人类很容易识别假图像和真图像

你可以阅读更多信息

简而言之,使用Resizing+Conv2D而不是Conv2dTranspose可以最小化这些棋盘瑕疵

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')