【问题标题】:Keras Convolutional Autoencoder blank outputKeras 卷积自动编码器空白输出
【发布时间】:2018-11-30 04:25:39
【问题描述】:

快速免责声明:我对 Keras、机器学习和一般编程很陌生。

我正在尝试为(当前)单个图像创建一个基本的自动编码器。虽然它似乎运行得很好,但输出只是一张白色图像。这是我得到的:

img_height, img_width = 128, 128

input_img = '4.jpg'
output_img = '5.jpg'

# load image
x = load_img(input_img)
x = img_to_array(x)  # array with shape (128, 128, 3)
x = x.reshape((1,) + x.shape)  # array with shape (1, 128, 128, 3)

# define input shape
input_shape = (img_height, img_width, 3)

model = Sequential()
# encoding
model.add(Conv2D(128, (3, 3), activation='relu', input_shape=input_shape, 
padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))

# decoding
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2,2)))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(3, (3, 3), activation='sigmoid', padding='same'))

model.compile(loss='binary_crossentropy', optimizer='adam')
print(model.summary())

checkpoint = ModelCheckpoint("autoencoder-loss-{loss:.4f}.hdf5", monitor='loss', verbose=0, save_best_only=True, mode='min') 
model.fit(x, x, epochs=10, batch_size=1, verbose=1, callbacks=[checkpoint])

y = model.predict(x)

y = y[0, :, :, :]
y = array_to_img(y)
save_img(output_img, y)

我查看了一些教程以供参考,但我仍然无法弄清楚我的问题是什么。

任何指导/建议/帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: python keras conv-neural-network autoencoder


    【解决方案1】:

    this 解决了这个问题。只是缺少代码

    x = x.astype('float32') / 255.
    

    这是一个 numpy 内置函数,用于将该向量中包含的值转换为浮点数。

    这允许我们得到十进制值,其中值除以 255。RGB 值存储为 8 位整数,因此我们将向量中的值除以 255 (2^8 - 1),以表示颜色作为 0.0 和 1.0 之间的十进制值。

    【讨论】:

    • 这真的很有帮助。我想我真正想要的是与输出基本相同的图像。为此,我似乎不需要任何标签,因为输出应该“匹配”输入。你能指出我如何做到这一点的方向吗?
    • 哦,我明白了。环顾 Keras 博客,我找到了this 卷积自动编码器教程。也许这就是你要找的东西?
    • 那个教程解决了这个问题(尽管我已经看过大约 1000 次了)。我错过了x = x.astype('float32') / 255.,它将像素值归一化在 0 和 1 之间。感谢您的帮助!
    • 太棒了! astype(..) 位是一个 numpy 内置函数,用于将该向量中包含的值转换为浮点数。当这些值除以 255 时,这也允许我们获得十进制值。RGB 值存储为 8 位整数,因此我们将向量中的值除以 255 (2^8 - 1),以将颜色表示为0.0 到 1.0 之间的十进制值。
    • 这个答案,虽然它碰巧对 OP 有用,但不正确:当您训练自动编码器时,model.fit(x, x, ...) 是完全正确的做法......
    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多