用自编码器进行图像去噪

在深度学习中,自编码器是非常有用的一种无监督学习模型。自编码器由encoder和decoder组成,前者将原始表示编码成隐层表示,后者将隐层表示解码成原始表示,训练目标为最小化重构误差,而且一般而言,隐层的特征维度低于原始特征维度。

自编码器只是一种思想,在具体实现中,encoder和decoder可以由多种深度学习模型构成,例如全连接层、卷积层或LSTM等,以下使用Keras来实现用于图像去噪的卷积自编码器。

1 结果

先看一下最后的结果,使用的是手写数字MNIST数据集,上面一行是添加噪音的图像,下面一行是去噪之后的结果。

2 代码

我使用Keras来实现自编码器,encoder和decoder使用CNN来实现。

加载Keras和numpy。

from keras.datasets import mnist import numpy as np

获取数据集MNIST,将像素点值转化到0-1区间,并且重塑为N×1×28×28的四维tensor。

(x_train, _), (x_test, _) = 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), 1, 28, 28)) x_test = np.reshape(x_test, (len(x_test), 1, 28, 28))

添加噪声,即叠加一个随机的高斯白噪声,并限制加噪之后的值仍处于0-1区间。

noise_factor = 0.5 x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) x_train_noisy = np.clip(x_train_noisy, 0., 1.) x_test_noisy = np.clip(x_test_noisy, 0., 1.)

看一下加噪之后的结果。

import matplotlib.pyplot as plt n = 10 plt.figure(figsize=(20, 2)) for i in range(n): ax = plt.subplot(1, n, i + 1) plt.imshow(x_test_noisy[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show()

画出来是这个样子的。

定义模型的输入。

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

定义encoder部分,由两个32×3×3的卷积层和两个2×2的最大池化层组成。

x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(input_img) x = MaxPooling2D((2, 2), border_mode='same')(x) x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(x) encoded = MaxPooling2D((2, 2), border_mode='same')(x)

定义decoder部分,由两个32×3×3的卷积层和两个2×2的上采样层组成。

# at this point the representation is (32, 7, 7) x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(encoded) x = UpSampling2D((2, 2))(x) x = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(x) x = UpSampling2D((2, 2))(x) decoded = Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same')(x)

将输入和输出连接起来,构成autoencoder并compile。

autoencoder = Model(input_img, decoded)autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

使用x_train作为输入和输出来训练我们的autoencoder,并使用x_test进行validation。

autoencoder.fit(x_train_noisy, x_train, nb_epoch=100, batch_size=128, shuffle=True, validation_data=(x_test_noisy, x_test))

使用autoencoder对x_test预测,并将预测结果绘制出来,和原始加噪图像进行对比。

decoded_imgs = autoencoder.predict(x_test_noisy) import matplotlib.pyplot as plt n = 10 plt.figure(figsize=(20, 4)) for i in range(n): # display original ax = plt.subplot(2, n, i + 1) plt.imshow(x_test_noisy[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # display reconstruction ax = plt.subplot(2, n, i + 1 + n) plt.imshow(decoded_imgs[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show()

这样便可以生成一开始看到的结果了,完整代码在我的github上。

https://github.com/Honlan/DLPlaying/blob/master/auto-encoder/4_denoising_autoencoder.py

3 其他内容

除了以上用于去噪的卷积自编码器,还有其他几个代码:

https://github.com/Honlan/DLPlaying/tree/master/auto-encoder

  • 1_simplest_possible_autoencoder:分别仅使用一层Dense作为encoder和decoder构成自编码器,并对MNIST数据集训练和重构,50 epoch之后loss为0.1068,val_loss为0.1051;
  • 2_deep_autoencoder:encoder和decoder从一层Dense增加到三层Dense,100 epoch之后loss为0.0974,val_loss为0.0966;
  • 3_convolutional_deep_autoencoder:encoder和decoder分别由CNN实现,100 epoch之后loss为0.0958,val_loss为0.0946;
  • 4_denoising_autoencoder:即以上详细讨论的去噪卷积自编码器;
  • 5_variational_autoencoder(VAE):隐层添加额外的限制,即训练目标为最小化重构误差,以及隐层表示分布和原始表示分布的交叉熵(KL Divergence)。

其中最后一个代码中的VAE将MNIST的原始图像数据映射到了一个二维的隐层,下面是隐层表示中的聚类结果,可以看到在隐层的表示空间中,相同数字所对应的图像汇聚到了一起。

如果将隐层中的点解码到原始的图像表示空间,则各个聚类中心会出现对应的数字,而类和类之间的位置则会出现“新的数字”,即不同数字之间的过渡形态。

原文发布于微信公众号 - 宏伦工作室(HonlanFarm)

原文发表时间:2016-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小鹏的专栏

感知机--模型与策略

看到模型和策略,应该很快联想到了李航的《统计学习方法》,统计学习方法的三要素定义为:模型、策略、算法。 感知机 感知机是二分类的线性分类模型,输入为实例的...

21850
来自专栏人工智能

机器学习实战之决策树

一、简介 决策树是一类常见的机器学习方法,以二分类任务为例,我们希望从给定训练数据集学得一个模型用以对新数据进行分类,比如通过一组数据通过模型训练得到以下的决策...

220100
来自专栏机器学习算法原理与实践

决策树算法原理(下)

    在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法。对于C4.5算法,我们也提到了它的不足,比如模型是用较为复...

10710
来自专栏LhWorld哥陪你聊算法

【机器学习】--层次聚类从初识到应用

聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小. 数据聚类算法可以分为结构性或者分...

29330
来自专栏机器学习算法与理论

核技巧

关于映射到更高维平面的方法。 对数据进行某种形式的转换,从而得到新的变量来表示数据。从一个特征空间转换到另一个特征空间(特征空间映射)。 其实也就是另外一种距离...

34960
来自专栏null的专栏

机器学习算法实现解析——libFM之libFM的训练过程之Adaptive Regularization

本节主要介绍的是libFM源码分析的第五部分之二——libFM的训练过程之Adaptive Regularization的方法。 5.3、Adaptive Re...

68870
来自专栏AI研习社

一文详解 Word2vec 之 Skip-Gram 模型(结构篇)

这次的分享主要是对Word2Vec模型的两篇英文文档的翻译、理解和整合,这两篇英文文档都是介绍Word2Vec中的Skip-Gram模型。下一篇专栏文章将会用T...

66640
来自专栏AI研习社

感知机(Perceptron)是怎么实现“知错能改”的?

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间中将实例划分为正负两类的...

39680
来自专栏机器学习算法原理与实践

感知机原理小结

    感知机可以说是最古老的分类方法之一了,在1957年就已经提出。今天看来它的分类模型在大多数时候泛化能力不强,但是它的原理却值得好好研究。因为研究透了感知...

8920
来自专栏小樱的经验随笔

【机器学习笔记之三】CART 分类与回归树

本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 ---- CART - Classification and Regression Trees...

48060

扫码关注云+社区

领取腾讯云代金券