【问题标题】:Keras convolutional autoencoder, MSE works on fashion_mnist but it doesn't on mnistKeras 卷积自动编码器,MSE 适用于 fashion_mnist,但不适用于 mnist
【发布时间】:2021-06-09 05:49:32
【问题描述】:

我正在关注本教程https://blog.keras.io/building-autoencoders-in-keras.html,特别是卷积示例。我不明白为什么如果我将损失函数从 binary_crossentropy 更改为 MSE,它只适用于 fashion_mnist。

使用 mnist,损失在第一个 epoch 后下降,不再变化。训练后,测试集上的预测图像只是黑色图像。使用 fashion_mnist 效果很好。

import keras
from keras import layers
import keras.backend as K

input_img = keras.Input(shape=(28, 28, 1))

x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional

x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(16, (3, 3), activation='relu')(x)
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = keras.Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='mse') # binary_crossentropy
from keras.datasets import mnist
from keras.datasets import fashion_mnist
import numpy as np

(x_train, _), (x_test, _) = mnist.load_data() # fashion_mnist.load_data()

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))

history = autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=128,
                shuffle=True,
                validation_data=(x_test, x_test))

【问题讨论】:

  • MSE 对错误分类的惩罚不够,但却是 regression 的正确损失。对于分类cross-entropy 往往比MSE 更合适。谈到您的问题,当我尝试预测时,我没有看到任何黑色图像。您能否尝试并分享您在 Google Colab 中的尝试,以便我们尽力为您提供最好的帮助。谢谢!

标签: python tensorflow keras deep-learning autoencoder


【解决方案1】:

我猜你想使用自动编码器执行一些图像去噪/重建。对于此类任务,MSE 是正确使用的损失。对于此任务,您必须在输出层使用线性激活函数,这样您就可以将重建的输出图像数组元素(像素)与标签图像的像素进行比较。像素通常未标准化,通常具有 0 到 255 之间的值。 Sigmoid 激活函数会将您的输出值标准化为 0 到 1 之间的值,这最适合分类任务,因为它为您提供了 2 个类别的类别概率(更多类别的 softmax)。 然后将此激活函数与交叉熵函数一起用于分类任务。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。

    这是我的架构(和你的一样+数据预处理是一样的,但我不在这里提交),黄色的是我正在玩的:

    但是我得到了这样的损失和验证损失:

    并按照您的描述重建结果全黑图像。

    我的解决方案是:

    1. 如果使用 Adam 优化器,请降低学习率(默认为 0.001,我改为 0.00005),否则我的损失函数会卡在与 here 提到的相同的值上 绿色图表。

    这是降低学习率后的结果

    1. 更改优化器 - SGD 也有帮助(即使使用默认值):

    1. 如上所述,在 0-1 缩放数据上将最后一个激活函数从 sigmoid 更改为线性也对我有用(正如我从代码中了解到的,您也可以在 0-1 区间缩放)

    【讨论】:

    • 请不要使用屏幕截图作为代码。始终将其粘贴为具有正确格式的文本。
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多