利用卷积自编码器对图片进行降噪
本篇文章3938字,读完约10分钟
雷锋。(公开号码:雷锋。com)出版社:这篇文章的原作者是田,原文载于作者的《智虎列机》。这篇文章被作者授权转载给雷锋。
前言
这周我工作太忙了,我想写更多的注意力转移,但是后来我没有时间写了。本周,我们将看一个简单的自编码器实战代码。我不会详细介绍自编码器的原理,但会在网上搜索很多。最简单的自编码器是通过编码器和解码器再现输入。例如,我们将一幅图片输入网络,自编码器的编码器对图片进行压缩以获得压缩信息,然后解码器对信息进行解码以再现原始图像。
绘图工具:omnigraffle
自编码器实际上是通过最小化目标和输入之间的差异来优化的,也就是说,让输出层尽可能多地再现原始信息。由于自编码器的基本形式很简单,所以自编码器有很多变体,包括dae、sdae、vae等。如果感兴趣的合作伙伴可以在互联网上搜索其他相关信息。
本文将实现两个演示。第一部分是实现一个简单的输入-隐藏-输出自编码器,第二部分是在第一部分的基础上实现卷积自编码器去噪。
工具描述
tensorflow1.0
jupyter笔记本
数据:最新手写数据集
完整代码地址:尼尔森赵/胡志
第一部分
首先,我们将使用上面所示的结构实现最简单的自动编码器。
加载数据
在这里,我们使用mnist手写数据集进行实验。首先,我们需要导入数据。tensorflow封装了这个实验数据集,因此使用起来非常简单。
如果想让数据显示灰度图像,使用代码 plt.imshow(img.reshape((28,28)), cmap= greys_r ) 即可。如果希望数据显示灰色图像,请使用代码PLT . imshow(img . resform((28,28)),cmap = greys _ r。
我们可以通过输入数据加载数据集。如果合作伙伴本地已经有了mnist数据集(四个压缩包),您可以将这四个压缩包放在目录mnist_data中,这样tensorflow就可以直接提取数据,而无需再次下载。我们可以通过imshow随意观看图像。因为我们加载的数据已经被处理成一个784维的向量,所以在重新显示时需要重新整形。
建筑模型
加载数据后,我们可以进行最简单的建模。在此之前,让我们得到输入数据的大小。我们加载的图片是一个28x28像素的块,张量流帮助我们将它处理成一个784维的向量。同时,我们还需要指定隐藏层的大小。
这里我指定64。隐藏单元越小,丢失的信息就越多。朋友们可以尝试其他尺寸来看结果。
自动编码器包含三层:输入、隐藏和输出。
在隐藏层,我们使用relu作为激活函数。
在这一点上,一个简单的自动编码器被构建,然后我们可以开始训练张量流图。
培训结果的可视化
完成上述步骤后,我们构建一个简单的自动编码器,并将结果可视化以查看其性能。
在这里,我从测试数据集中选择了五个样本进行可视化。同样,如果我想观察灰度图像,我可以将cmap参数指定为greys _ r。上面的第一行是测试数据集中的原始图片,第二行是自动编码器复制的图片,因此可以清楚地看到像素信息的丢失。
同样,我们也可以可视化隐藏层压缩的数据,结果如下:
这五幅图片对应于测试中五幅图片的隐藏层的压缩图像。
通过上面一个简单的例子,我们了解了自动编码器的基本工作原理。接下来,我们将进一步改进我们的模型,并将隐藏层转换为卷积层进行图像去噪。
在上述过程中省略了部分代码。请检查我的github上的完整代码。
第二部分
在了解上述自动编码器工作原理的基础上,我们将在这部分自动编码器中加入几个卷积层来降低图像的噪声。
同样,我们仍然使用mnist数据集进行实验。我们不会重复数据导入的步骤。请下载代码查看。在我们开始之前,让我们通过一张图片来看看我们的整个模型结构:
绘图工具:omnigraffle
我们在模型中输入一幅有噪声的图像,并在输出端给模型一幅无噪声的图像,这样模型就可以通过卷积自编码器学习降噪过程。
输入层
这里的输入层不同于上一部分的输入层,因为我们将在这里使用卷积运算,所以输入层应该是一个高度x宽度x深度的图像,并且一般的图像深度是rgb格式的三层,这里的mnist数据集的深度只有1。
编码器卷积层
编码器卷积层具有三个卷积和汇集层来处理图像。
在第一层卷积中,我们使用了64个大小为3×3的滤波器。默认情况下,跨步设置为1,填充设置为相同后,我们的高度和宽度不会改变。因此,在第一层卷积之后,我们得到的数据从原来的28 x 28 x 1变为28 x 28 x 64。
然后,对卷积结果进行最大汇集。这里,我将大小和步长设置为2×2,并且合并操作不会改变卷积结果的深度,因此合并后的大小是14×14×64。
将不详细描述其他卷积层。所有卷积层的激活函数都是可变的。
经过三层卷积和汇集运算后,我们得到的conv3实际上相当于前一部分中自动编码器的隐藏层,并且该层的数据已经被压缩到4×4×32的大小。
此时,我们已经在编码器上完成了卷积运算,数据维数已经从28 x 28 x 1变为4 x 4 x 32。
解码器卷积层
接下来,我们将在解码器端开始卷积。在此之前,一些朋友可能会问,既然图片已经在编码器中被卷成4×4×32,如果我们继续在解码器中进行卷积,数据的大小会不会越来越小?因此,在解码器端,我们不简单地执行卷积运算,而是使用上采样(中文翻译可以是上采样)+卷积的组合。
我们知道卷积运算是通过滤波器扫描图像中的每个块,然后在对块中的像素块进行加权和求和后进行非线性处理。例如,如果我们的补丁在原始图片中的大小是3×3(流行的观点是我们在图片中取一个大小为3×3的像素块),那么我们使用一个3×3的过滤器来处理这个补丁,然后这个补丁将在卷积后变成一个像素块。在反卷积(或转置卷积)中,这个过程是相反的,并且一个像素块将被扩展成3×3像素块。
然而,反卷积有一些缺点,这将导致图像中的棋盘图案,因为在反卷积期间在滤波器中将有许多重叠。为了解决这个问题,建议使用上采样加卷积层。
有两种常用的上采样方法,一种是最近邻插值,另一种是双线性插值。
在本文中,上采样加卷积也被用来处理解码器。
上采样操作也封装在张量流中。我们使用resize _近邻来调整编码器卷积结果的大小,然后执行卷积处理。经过三次上采样操作,我们得到的数据大小为28 x 28 x 64。最后,我们需要再次对这个结果进行卷积,并将其处理成原始图像的大小。
最后一步是定义损失和优化器。
我们使用交叉熵来计算损失函数,优化后的函数的学习率为0.001。
构建噪声数据
通过以上步骤,我们构建了完整的卷积自编码模型。因为我们想通过这个模型去噪,所以我们需要在训练前根据原始数据构造噪声数据。
我们通过上面一个简单的例子来看一下如何加入噪声,我们获取一张图片的数据 img(大小为 784),在它的基础上加入噪声因子乘以随机数的结果,就会改变图片上的像素。接着,由于 mnist 数据的每个像素数据都被处理成了 0-1 之间的数,所以我们通过 numpy.clip 对加入噪声的图片进行 clip 操作,保证每个像素数据还是在 0-1 之间。让我们通过上面的一个简单例子来看看如何添加噪声。我们得到一张图片的数据img(大小784),加上噪声因子乘以图片上的随机数,这将改变图片上的像素。然后,因为mnist数据的每个像素数据被处理成0-1之间的数字,所以我们使用numpy.clip来剪切有噪声的图像,以确保每个像素数据仍然在0-1之间。
np.random.randn(*img.shape) 的操作等于 np.random.randn(img.shape[0], img.shape[1])NP . rand . randn(* img . shape)的运算等于NP . rand . randn(img . shape[0],img.shape [1])
让我们看看添加噪声前后的图像对比度。
培训模式
在介绍了建模和噪声处理之后,接下来我们可以训练我们的模型。
在训练模型时,我们的输入已经变成了加入噪声后的数据,而输出是没有噪声的原始数据,所以我们主要需要对原始数据进行整形,并将其改变为与inputs_相同的格式。由于卷积运算的深度,模型训练有点慢,所以建议使用gpu运行。
记得最后关闭会话。
结果的可视化
经过以上长时间的训练,我们的模型最终得到了训练,然后我们将通过可视化看到模型的有效性。
可以看出,通过卷积自编码器,我们的降噪效果还是很好的,得到的图像看起来很平滑,噪声几乎是不可见的。
有些朋友可能会想,我们也可以使用基本版本的自动编码器的输入-隐藏-输出结构来实现降噪。因此,我还用最简单的输入-隐藏-输出结构实现了一个版本的降噪训练模型(代码在我的github中)。让我们看看它的结果:
可以看出,与卷积自编码器相比,其降噪效果较差,并且在重建图像中可以看到一些噪声阴影。
结局
在这一点上,我们已经完成了自动编码器模型的基本版本,并增加了卷积层去噪图像。我相信我的朋友们对自动编码器有了初步的了解。
完整的代码已经放在我的github(尼尔森赵/胡志)上,它包含六个文件:
Basicae,自动编码器的基本版本(包括jupyter笔记本和html文件)
Easydae,降噪自动编码器的基本版本(包括jupyter笔记本和html文件)
Convdae,卷积降噪自动编码器(包括jupyter笔记本和html文件)
如果感觉不错,为我的github订购一颗星会更好!
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:利用卷积自编码器对图片进行降噪
地址:http://www.6st8.com/zbxw/5504.html
免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。