У меня много проблем с пониманием поведения моей модели, и мне нужна помощь, чтобы понять это.
Предположим, этот автоэнкодер состоит из всех слоев свертки:
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, но ничего не помогает.
Так что я предполагаю, что это связано с архитектурой, но я не понимаю, почему.
Если бы кто-нибудь мог дать мне хорошее объяснение, я был бы очень благодарен.