Почему в примерах документации Keras для автономных кодировщиков используется Conv2D вместо Conv2DTranspose - PullRequest
0 голосов
/ 06 мая 2020

Я следил за документацией 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. Но некоторые другие статьи объясняют, как автокодеры CNN используют Conv2DTranspose в качестве замены Upsampling2D и Conv2D. Я видел несколько вопросов, связанных с самой Conv2DTranspose. Но я не нашел ответа на свой вопрос.

Мой вопрос: могу ли я использовать Conv2DTranspose вместо слоев Upsampling2D и Conv2D. Если да, то почему сами авторы (документация Keras) не использовали его? Какая разница?

1 Ответ

1 голос
/ 06 мая 2020

Свертки транспонирования часто приводят к появлению артефактов, называемых Checkerboard artifacts - Маленькие соседние квадраты, легко отличимые друг от друга. Это позволяет людям легко отличать поддельные изображения от реальных.

Вы можете прочитать эту статью для получения дополнительной информации.

Короче говоря, используя Resizing + Conv2D вместо of Conv2dTranspose минимизирует эти артефакты шахматной доски.

...