【问题标题】:Output image of CNN autoencoder is whiteCNN自动编码器的输出图像为白色
【发布时间】:2020-07-27 13:00:22
【问题描述】:

我在训练自动编码 CNN 时遇到问题。我的目标是以无人监督的方式对文档图像(收据、信件等)进行聚类(顺便说一句,除了自动编码器之外,您还有其他算法吗?)。

所以我尝试做一个自动编码器,但我总是得到奇怪的解码输出,我不知道是什么问题。我从一个没有大量压缩的非常简单的模型开始:

    Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_62 (Conv2D)           (None, 100, 76, 16)       448       
_________________________________________________________________
activation_62 (Activation)   (None, 100, 76, 16)       0         
_________________________________________________________________
conv2d_63 (Conv2D)           (None, 50, 38, 32)        4640      
_________________________________________________________________
activation_63 (Activation)   (None, 50, 38, 32)        0         
_________________________________________________________________
conv2d_64 (Conv2D)           (None, 50, 38, 32)        9248      
_________________________________________________________________
activation_64 (Activation)   (None, 50, 38, 32)        0         
_________________________________________________________________
up_sampling2d_26 (UpSampling (None, 100, 76, 32)       0         
_________________________________________________________________
conv2d_65 (Conv2D)           (None, 100, 76, 16)       4624      
_________________________________________________________________
activation_65 (Activation)   (None, 100, 76, 16)       0         
_________________________________________________________________
up_sampling2d_27 (UpSampling (None, 200, 152, 16)      0         
_________________________________________________________________
conv2d_66 (Conv2D)           (None, 200, 152, 3)       435       
_________________________________________________________________
activation_66 (Activation)   (None, 200, 152, 3)       0         
=================================================================
Total params: 19,395
Trainable params: 19,395
Non-trainable params: 0

我使用少量输入(~200)进行训练,这样训练速度很快,我可以更快地调试。

似乎模型在 20 个 epoch 和 32 个批量大小后收敛:

Epoch 1/20
4/4 [==============================] - 5s 1s/step - loss: 0.4359
Epoch 2/20
4/4 [==============================] - 5s 1s/step - loss: 0.4290
Epoch 3/20
4/4 [==============================] - 4s 904ms/step - loss: 0.4192
Epoch 4/20
4/4 [==============================] - 5s 1s/step - loss: 0.4045
Epoch 5/20
4/4 [==============================] - 3s 783ms/step - loss: 0.3886
Epoch 6/20
4/4 [==============================] - 3s 797ms/step - loss: 0.3706
Epoch 7/20
4/4 [==============================] - 5s 1s/step - loss: 0.3393
Epoch 8/20
4/4 [==============================] - 3s 777ms/step - loss: 0.3165
Epoch 9/20
4/4 [==============================] - 3s 850ms/step - loss: 0.2786
Epoch 10/20
4/4 [==============================] - 3s 780ms/step - loss: 0.2436
Epoch 11/20
4/4 [==============================] - 3s 817ms/step - loss: 0.2036
Epoch 12/20
4/4 [==============================] - 3s 771ms/step - loss: 0.1745
Epoch 13/20
4/4 [==============================] - 5s 1s/step - loss: 0.1347
Epoch 14/20
4/4 [==============================] - 3s 820ms/step - loss: 0.1150
Epoch 15/20
4/4 [==============================] - 5s 1s/step - loss: 0.1017
Epoch 16/20
4/4 [==============================] - 3s 792ms/step - loss: 0.0886
Epoch 17/20
4/4 [==============================] - 3s 789ms/step - loss: 0.0868
Epoch 18/20
4/4 [==============================] - 3s 842ms/step - loss: 0.0844
Epoch 19/20
4/4 [==============================] - 3s 762ms/step - loss: 0.0797
Epoch 20/20
4/4 [==============================] - 3s 779ms/step - loss: 0.0768

但输出图像看起来都是这样的:

output of autoencoder (example)

对于损失,我使用了平均绝对误差和 SGD 优化器(其他的不能很好地收敛)。

我尝试推动 epoch 的数量,但损失停滞在 0.07 左右并且没有下降。

我做错了什么?有什么改进它的想法吗?提前致谢。

编辑:这是代码

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(rescale=1./255, zca_whitening=False, rotation_range=0.2, width_shift_range=0.005, height_shift_range=0.005, zoom_range=0.005)
train_generator = datagen.flow_from_directory('fp_img',class_mode='input',target_size=image_dims, batch_size=batch_size,shuffle=True)

import tensorflow.keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Activation, Flatten, Input
from tensorflow.keras.layers import Conv2D, MaxPooling2D, UpSampling2D, Reshape
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator

input_shape = image_rgb_dims

# Define the model
model = Sequential()

model.add(Conv2D(16, (3, 3), strides=2, padding='same', input_shape=image_rgb_dims))
model.add(Activation('relu'))

model.add(Conv2D(32, (3, 3), strides=2, padding='same'))
model.add(Activation('relu'))

model.add(Conv2D(32,(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(UpSampling2D((2, 2)))

model.add(Conv2D(16,(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(UpSampling2D((2, 2)))

model.add(Conv2D(3,(3, 3), padding='same'))
model.add(Activation('sigmoid'))

model.summary()

# Compile the model
model.compile(optimizer='adagrad', loss='mean_absolute_error')

# Train the model
model.fit(
        train_generator,
        steps_per_epoch= n_images // batch_size,
        epochs=20)

【问题讨论】:

  • 您的代码中可能有一个萌芽。你能分享你的代码吗?
  • 我刚刚编辑并在最后添加了代码
  • 图像主要是白色的(因为上面有文字),所以也许这就是它过度拟合并且输出都是白色的原因?

标签: tensorflow machine-learning keras data-science autoencoder


【解决方案1】:

几个提示:

  • 您正在尝试创建一个自动编码器来对图像进行聚类,但您的嵌入不是一维的。您将如何对图像进行聚类?您需要 Dense 层或更多 Conv 层才能转到一维向量,以便能够在欧几里德距离上进行聚类。
  • 当您尝试仅对 1 个非数据增强图像进行训练时会发生什么情况?您的网络是否过拟合以生成单个图像,或者您仍然会得到白色图像?如果是前者,则网络确实过度拟合而仅生成白色像素。一种解决方案是在损失函数中惩罚“不生成黑色像素”。如果是后者,您在某处仍有错误,可能是您没有正确缩放图像。
  • 200 张图片不算多,我不会尝试在自动编码器的如此小的数据集上验证您的模型的性能。
  • 您的所有图像都有文字吗?您可以尝试使用 OCR 对图像进行预处理,并根据出现的单词而不是图像上的词进行聚类。特征甚至可以只是单词的数量,或者数字的数量......
  • 如果您坚持使用 CNN,如果用于聚类,我会尝试将您的图像大小调整为小很多,现在对于您想要从头开始训练的网络来说,这非常大。

【讨论】:

  • 我刚刚用 lena 图像尝试了我的代码(以及带有密集的完整模型),经过 200 次迭代后,输出非常好,这意味着我的数据是问题(白色太多)。
  • 我会先尝试使用更多图像进行训练!您也可以尝试反转黑白,如果您的图像出现黑色,您非常确定它过度拟合。我希望我的提示可以帮助您入门!
【解决方案2】:
  • 我知道我必须在中间添加一个密集层,但我将那部分注释掉了,因为如果它不适用于 2 个 conv,那么它就不可能使用更多的 conv + dense
  • 我尝试使用 1 张单张图像,发现它过度拟合。使用 1 个 epoch,输出很好,但是随着每个新的 epoch,它变得越来越白,而损失仍在减少。最后,它是纯白色的。
  • 我知道,我目前正在尝试使用 1k 图像。我选择了 200 以便我可以快速调试,不想每次更新等待 10 分钟。
  • 是的,我的几乎所有图片都有文字。实际上,OCR 技术也正在由一位同事研究。我的工作是尝试根据文档的“布局”进行聚类。
  • 好的,我会尝试将它们调整为更小,但问题是它们变得非常丑陋,有时我会丢失信息(左上角的徽标可能很棒,因为群集功能变得难以辨认) .

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2019-12-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多