Почему этот Автоэнкодер, состоящий из всех сверток, продолжает выводить изображение в чистое / белое изображение? - PullRequest
0 голосов
/ 21 июня 2019

У меня много проблем с пониманием поведения моей модели, и мне нужна помощь, чтобы понять это.
Предположим, этот автоэнкодер состоит из всех слоев свертки:

initializer = he_uniform()

#Input
input_tensor_a = Input(shape=(128,128,3))

#Encoder
conv1 = Conv2D(64, kernel_size=7, padding='same', kernel_initializer=initializer)(input_tensor_a)
bn1 = BatchNormalization()(conv1)
relu1 = Activation('relu')(bn1)

conv2 = Conv2D(128, kernel_size=3, strides=2, padding='same', kernel_initializer=initializer)(relu1)
bn2 = BatchNormalization()(conv2)
relu2 = Activation('relu')(bn2)

conv3 = Conv2D(256, kernel_size=3, strides=2, padding='same', kernel_initializer=initializer)(relu2)
bn3 = BatchNormalization()(conv3)
relu3 = Activation('relu')(bn3)

conv4 = Conv2D(512, kernel_size=3, strides=2, padding='same', kernel_initializer=initializer)(relu3)
bn4 = BatchNormalization()(conv4)
relu4 = Activation('relu')(bn4)

#Decoder
ups1 = UpSampling2D(size=(2,2))(relu4)
up_conv1 = Conv2D(256, kernel_size=3, padding='same', kernel_initializer=initializer)(ups1)
bn5 = BatchNormalization()(up_conv1)
relu5 = Activation('relu')(bn5)

ups2 = UpSampling2D(size=(2,2))(relu5)
up_conv2 = Conv2D(128, kernel_size=3, padding='same', kernel_initializer=initializer)(ups2)
bn6 = BatchNormalization()(up_conv2)
relu6 = Activation('relu')(bn6)

ups3 = UpSampling2D(size=(2,2))(relu6)
up_conv3 = Conv2D(64, kernel_size=3, padding='same', kernel_initializer=initializer)(ups3)
bn7 = BatchNormalization()(up_conv3)
relu7 = Activation('relu')(bn7)

up_conv4 = Conv2D(3, kernel_size=7, padding='same', activation='tanh', kernel_initializer=glorot_uniform())(relu7)

optimizer = Adam(0.00001)
#loss is mean_squared_error

Я знаю, что эта архитектура может быть не очень хорошей, но я просто хочу понять ее поведение.

Продолжается следующее:
(У меня недостаточно репутации, чтобы публиковать изображения напрямую)

Это входное изображение:
(https://i.imgur.com/d2B9vfJ.png)

Это изображение после первых 5 эпох:
(https://i.imgur.com/WHKjdxo.png)

А теперь еще через несколько эпох:
(https://i.imgur.com/zxoa7zW.png)

Как вы можете видеть, Модель все больше и больше сдвигает выходное изображение к пустому изображению, пока в конце оно не станет полностью белым пустым изображением.

Потеря начинается примерно с 25000 и будет очень медленно уменьшаться до 24000, а затем застревает там (что, вероятно, является состоянием пустого изображения)

Я пробовал разные скорости обучения, переключая уровни bn и relu, другую функцию потерь, чем у 'mse', с и без kernel_initializer, но ничего не помогает.

Так что я предполагаю, что это связано с архитектурой, но я не понимаю, почему.

Если бы кто-нибудь мог дать мне хорошее объяснение, я был бы очень благодарен.

1 Ответ

0 голосов
/ 22 июня 2019

Вы упомянули, что вы используете потерю MSE.Вы также упомянули, что первоначальная потеря составляет около 25 000.Я предполагаю, что входные данные для вашей модели не находятся в диапазоне [-1, 1] (в противном случае максимальная средняя квадратическая ошибка была бы 4).В такой ситуации любой автоэнкодер не сможет правильно выучить осмысленные представления.Если это действительно так, попробуйте изменить масштаб входов до того же масштаба, что и выходы.

...