为什么这个由所有卷积组成的自动编码器不断将输出推送到空白/白色图像?



我在理解模型的行为时遇到了很多麻烦,需要一些帮助来尝试弄清楚。
假设这个自动编码器由所有卷积层组成:

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.stack.imgur.com/72Miv.png)

这是前 5 个纪元之后的图像:
(https://i.stack.imgur.com/K6JhR.png)

现在再过几个时代:
(https://i.stack.imgur.com/P7mBQ.png)

如您所见,模型将输出图像越来越推到空白图像,直到最后它将是一个全白的空白图像。

损失从 25000 左右开始,会非常缓慢地减少,直到像 24000 然后卡在那里(这可能是空白图像状态)

我尝试了不同的学习率,切换 bn 和 relu 层,与"mse"不同的损失函数,有和没有kernel_initializer但没有任何帮助。

所以我认为这与弧形有关,但我不明白为什么。

如果有人能给我一个很好的解释,我将不胜感激。

您提到您使用的损失是 MSE。 您还提到初始损失约为25,000。 我的猜测是模型的输入不在 [-1, 1] 范围内(否则最大均方误差为 4)。 在这种情况下,任何自动编码器都无法正确学习有意义的表示。 如果确实如此,请尝试将输入重新缩放到与输出相同的比例。

最新更新