CNN自动编码器的输出图像为白色

时间:2020-07-27 13:00:22

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

我在训练自动编码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个历元和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优化器(其他算法的收敛性不是很好)。

我试图增加时期数,但损失停滞在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)

2 个答案:

答案 0 :(得分:0)

一些提示:

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

答案 1 :(得分:0)

  • 我知道我必须在中间添加一个密集层,但是我注释掉了这一部分,因为如果它不适用于2个conv,则没有机会使用更多conv +密集
  • 我尝试了1张单张图片,但发现它过拟合。在1个历元中,输出效果不错,但在每个新历元中,它变得越来越白,而损耗仍在降低。最后是纯白色。
  • 我知道,我目前正在尝试处理1k张图像。我选择了200个,以便可以快速调试,不想等待10分钟进行每次更新。
  • 是的,几乎我所有的图像都有文字。实际上,一位同事也在研究OCR技术。我的工作是尝试根据文档的“版式”进行聚类。
  • 好吧,我会尝试将它们调整为较小的大小,但是问题是它们变得丑陋,有时我会丢失信息(左上角的徽标可能会变得很不美观,因为它会使聚类功能变得不合法) 。
相关问题