【问题标题】:Why does this Autoencoder consisting of all convolutions keep pushing the output to a blank/white image?为什么这个由所有卷积组成的自动编码器不断将输出推到空白/白色图像?
【发布时间】:2019-06-21 17:06:26
【问题描述】:

我在理解我的模型的行为时遇到了很多麻烦,需要一些帮助才能弄清楚。
假设这个 Autoencoder 由所有卷积层组成:

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 个 epoch 之后的图像:
(https://i.imgur.com/WHKjdxo.png)

现在又过了几个时代:
(https://i.imgur.com/zxoa7zW.png)

如您所见,模型将输出图像越来越远地推送到空白图像,直到最后它将成为全白的空白图像。

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

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

所以我认为它与架构有关,但我不明白为什么。

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

【问题讨论】:

    标签: python image keras convolution autoencoder


    【解决方案1】:

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

    【讨论】:

    • 是的,实际上我昨晚也想通了......在我将输入从 [0,255] 缩放到 [0,1] 之后,它工作得很好。一个后续问题:由于我使用的是 tanh,输入应该缩放到 [-1,1] 还是 [0,1] 可以吗?我的图像仍然明显模糊,我想知道将其映射到 [-1,1] 是否会改善它
    • 输入和输出必须在同一范围内,否则你永远无法希望将损失减少到零。关于模糊,我猜这既是由于输入/输出范围的不匹配而发生的,但它也是经过 MSE 损失训练的自动编码器的固有属性。为了获得更清晰的结果,GAN 可能是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2021-06-17
    • 1970-01-01
    • 2012-01-30
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多