TensorFlow2实现去噪自编码器(Denoising Autoencoder)

简介: 去噪自编码器 (Denoising Autoencoder, DAE) 的目的就是用来去除图像中的噪声。本文将利用Tensorflow2实现使用 MNIST 数据集的 DAE。

去噪自编码器(Denoising Autoencoder, DAE)

在介绍去噪自编码器 (Denoising Autoencoder, DAE) 之前,首先介绍下DAE的一种使用场景示例,当我们在夜晚拍照时,或者其他黑暗环境时,我们的照片总是被大量的噪点所充斥,严重影响了图像质量,而 DAE 的目的就是用来去除这些图像中的噪声。为了更好的讲解 DAE,使用简单的 MNIST 数据集进行演示,以将我们的重心放在有关 DAE 的知识上。如下图所示,显示了三组 MNIST 数字。每组的顶行是原始图像 (Original Images);中间的行显示 DAE 的输入 (Noised Images),这些输入是被噪声破坏的原始图像,当噪声过多时,我们将很难读懂被破坏的数字;最后一行显示DAE的输出 (Denoised Images)。

8eaaf9c723d0472f9847bd17acd62a1d_tplv-k3u1fbpfcp-zoom-1.png

Tips:如果对于自编码器还不是很了解的话,可以参考自编码器模型详解与实现(采用tensorflow2.x实现)

接下来就让我们实际构建一个 DAE,以消除图像中的噪声。

DAE模型架构1d27530a77874645acb1417da21eca54_tplv-k3u1fbpfcp-zoom-1.png

根据 DAE 的介绍可以将输入定义为:

x = xorig + noise

其中 xorig 表示被噪声 noise 破坏的原始 MNIST 图像,编码器的目的是学习潜矢量 z。DAE的损失函数表示为:

屏幕截图 2021-12-23 153400.png

其中,m 是输出的维度,例如在MNIST数据集中,m=width × height×channels=28 × 28 × 1 = 784。xorigi 和 xi 分别是 xorigimage.png 中的元素。

DAE实现

数据预处理

为了实现 DAE,首先需要构造训练数据集,输入数据是添加噪声的 MNIST 数字,训练输出数据是原始的干净 MNIST 数字。添加的噪声需要满足高斯分布,均值 μ = 0.5,标准差 σ = 0.5。由于添加随机噪声可能会产生小于0或大于1的无效像素值,因此需要将像素值裁剪为 [0.0,1.0] 范围内。

# 数据加载(x_train,_),(x_test,_) =keras.datasets.mnist.load_data()
# 数据预处理image_size=x_train.shape[1]
x_train=np.reshape(x_train,[-1,image_size,image_size,1])
x_test=np.reshape(x_test,[-1,image_size,image_size,1])
x_train=x_train.astype('float32') /255.x_test=x_test.astype('float32') /255.# 产生高斯分布的噪声noise=np.random.normal(loc=0.5,scale=0.5,size=x_train.shape)
x_train_noisy=x_train+noisenoise=np.random.normal(loc=0.5,scale=0.5,size=x_test.shape)
x_test_noisy=x_test+noise# 将像素值裁剪为[0.0,1.0]范围内x_train_noisy=np.clip(x_train_noisy,0.0,1.0)
x_test_noisy=np.clip(x_test_noisy,0.0,1.0)

模型构建与模型训练

#编码器inputs=keras.layers.Input(shape=input_shape,name='encoder_input')
x=inputsforfiltersinlayer_filters:
x=keras.layers.Conv2D(filters=filters,
kernel_size=kernel_size,
strides=2,
activation='relu',
padding='same')(x)
shape=keras.backend.int_shape(x)
x=keras.layers.Flatten()(x)
latent=keras.layers.Dense(latent_dim,name='latent_vector')(x)
encoder=keras.Model(inputs,latent,name='encoder')
# 解码器latent_inputs=keras.layers.Input(shape=(latent_dim,),name='decoder_input')
x=keras.layers.Dense(shape[1]*shape[2]*shape[3])(latent_inputs)
x=keras.layers.Reshape((shape[1],shape[2],shape[3]))(x)
forfiltersinlayer_filters[::-1]:
x=keras.layers.Conv2DTranspose(filters=filters,
kernel_size=kernel_size,
strides=2,
padding='same',
activation='relu')(x)
outputs=keras.layers.Conv2DTranspose(filters=1,
kernel_size=kernel_size,
padding='same',
activation='sigmoid',
name='decoder_output')(x)
decoder=keras.Model(latent_inputs,outputs,name='decoder')
autoencoder=keras.Model(inputs,decoder(encoder(inputs)),name='autoencoder')
# 模型编译与训练autoencoder.compile(loss='mse',optimizer='adam')
autoencoder.fit(x_train_noisy,
x_train,validation_data=(x_test_noisy,x_test),
epochs=10,
batch_size=batch_size)
# 模型测试x_decoded=autoencoder.predict(x_test_noisy)

效果展示2ac7f8578ec44d53a6c45ead21c84050_tplv-k3u1fbpfcp-zoom-1.png


如上图所示,当噪声水平从 σ=0.5 增加到 σ=0.75 和 σ=1.0 时,DAE 具有一定的鲁棒性,可以较好的恢复出原始图像。但是,在 σ=1.0 时,某些数字,没有被正确地恢复。

相关文章
|
TensorFlow API 算法框架/工具
TensorFlow利用函数API实现简易自编码器
TensorFlow利用函数API实现简易自编码器
62 0
TensorFlow利用函数API实现简易自编码器
|
数据挖掘 TensorFlow 算法框架/工具
使用TensorFlow创建能够图像重建的自编码器模型
使用TensorFlow创建能够图像重建的自编码器模型
123 0
使用TensorFlow创建能够图像重建的自编码器模型
|
机器学习/深度学习 TensorFlow 算法框架/工具
|
机器学习/深度学习 JavaScript TensorFlow
【翻译】Sklearn与TensorFlow机器学习实用指南 —— 第15章 自编码器
关联权重 当自编码器整齐地对称时,就像我们刚刚构建的那样,一种常用技术是将解码器层的权重与编码器层的权重相关联。 这样减少了模型中的权重数量,加快了训练速度,并限制了过度拟合的风险。 不幸的是,使用fully_connected()函数在 TensorFlow 中实现相关权重有点麻烦;手动定义层实际上更容易。
|
机器学习/深度学习 JavaScript 数据可视化
|
机器学习/深度学习 数据可视化 TensorFlow
《Scikit-Learn与TensorFlow机器学习实用指南》第15章 自编码器
第15章 自编码器 来源:ApacheCN《Sklearn 与 TensorFlow 机器学习实用指南》翻译项目 译者:@akonwang 校对:@飞龙 自编码器是能够在无监督的情况下学习输入数据(叫做编码)的人工神经网络(即,训练集是未标记)。
1282 0
|
TensorFlow 算法框架/工具
(TensorFlow)变分自编码器实现
一个小例子带你玩转(TensorFlow)变分自编码器,文中有源码下载!
4875 0
|
2天前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
15 0
|
11天前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
23 0
|
21天前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
42 0

相关实验场景

更多