上一节课,我们给大家详细讲解了自编码卷积神经网络的用法,相信大家对卷积神经网络比较了解了,也看到了卷积神经网络的优秀性能。
不过很多同学都有个疑问:前面一直都是对理想数据进行处理,这样有多大用处呢?那用在实际中是怎样应用的呢?第一节课我们讲过,自编码可以用在预训练、自动创作、自动填充、去除噪声、数据降维等等方向。今天我们就从最常见的降噪这项应用开始讲解。
一、降噪自动编码的由来
降噪自动编码器(Denoising AutoEncoder)最初的应用是为了让自动编码网络有更强的鲁棒性(Robust)。
这是什么原理呢?
就是将原始的完整数据以一定概率分布(通常使用二项分布)去擦除,然后将处理后的结果作为输入的训练数据。这样训练出来的网络抗干扰能力更强,预测的结果往往更好。
就比如下图:
原始的数据是x,首先我们随机的去掉了x中的两个数据形成了x’,然后我们用这个有破损(术语叫Corruputed)的数据x’作为训练数据来训练自编码网络y,训练过程中计算出的结果是z,然后将z与原始x做误差迭代不断优化网络y。最后训练出来的y就有了更好的性能。
为什么训练破损的数据更能激发网络的鲁棒性呢?有论文解释说神经网络通过从破损数据中学习到有效特征数据,从而恢复完整的数据。这个训练过程是增强了神经网络特征提取的能力。就是说学习破损数据的过程相当于一个简化的PCA,本质是进行降维提取。而降维就是神经网络最擅长的工作之一。
二、降噪自动编码在地震去噪领域的应用
前面提到了通过训练破损的数据,可以提高自编码网络学习能力。那含有噪声的数据,也是一种破损的数据,同样可以使用自编码网络进行降噪处理。
在地震勘探领域,伴随地震数据采集过程中,由于人为或环境因素的影响,不可避免地会引入随机噪声。受污染的地震资料严重影响了后续的地震资料处理和成像。因此,抑制随机噪声可以有效地提高地震资料的信噪比,有利于提高成像质量。
比如我们常常会将左图的含噪数据进行降噪处理,变成右图的样子。
自编码网络天生就有很强的特征信息提取能力,因此特别适合降噪的处理这一类的应用。那到底效果如何呢?我们通过案例来告诉你。
三、降噪自动编码实战案例
这个部分,我们带领大家来实战操作地震去噪的整个处理过程。
1.网络结构
网络结构这部分和前面课程是一样的。实现了一个卷积自动编码网络。主要使用了卷积层、最大池化层、上采样层等结构,形成镜像的关系。其中卷积和池化成对,通过层层堆叠形成了深度学习关系。
2.数据准备
我们的目标是这个工区的数据进行去噪处理。
我们首先要准备训练数据集。我们准备了多个无噪声的训练数据,加上了噪声对神经网络模型进行训练。
3.网络训练
(1)训练数据和标签数据准备
自己写了getPathAddNoise的程序,将多个地震训练数据合成了一个含噪声的训练集。这个程序比较复杂就不细讲了,最后结果就是生成了3400个64×64的地震训练数据。
干净的地震数据是怎样加上噪声的呢?我们对干净的地震仿真数据加上随机噪声,程序是这样写的。
这里的主要步骤:首先是要将地震信号归一化到-1至1的取值空间。然后加上了15%的随机噪声。
(2)神经网络结构
这里的神经网络结构与上节课非常类似。但有两点不同,一是优化器从adam改为了adadelta,这个优化器有个特点就是速度较快。二是loss函数改为mean_squared_error,这个损失函数在处理无异常值的情况下,效果更好。
接下来我们通过30个周期迭代,让模型进行了深度的学习。
这里有个很有意思的地方是,我们的训练数据和标签数据都用的是一个,就是含噪声的训练数据。这个训练方式和有监督学习不太一样。这种训练方式称为自监督学习。即我们不需要标签数据,直接从唯一的训练集中学习数据特征。为了体现自编码网络强大的学习能力,我们直接用含噪声的数据集来训练,看看它能不能从中学习到有效的信号。
在整个网络的调优过程中,有以下几个经验分享给大家:
一是训练数据的尺寸尽量小一些,从28至64的范围比较合适,再大的话数据量就会较大,造成训练速度较慢。
二是训练数据的数量尽量多一些,训练周期长一些,这样学习质量比较高。一般来说数量在1万以上比较好,比如Mnist的训练数据是6万,训练周期在50次以上。本次教程限于原理呈现,只用了3000多个训练数据,训练了30个周期,还未体现自编码更好的效果。
三是最后一层的激活函数为tanh,而不是前面的sigmoid。因为地震数据远比Mnist图片数据复杂,使用逻辑激活函数不能满足要求。
4.结果检验
从训练过程来看,loss值持续下降并逐步收敛,证明构建的网络结构比较有效,参数设置正确。
现在我们来构造测试的数据。
我们制作了和训练数据不同的一个测试仿真数据,然后加上了15%的随机噪声。左图是清晰数据,右图是噪声数据。
程序是这样写的:
首先,加载测试仿真数据。然后把数据进行归一化,加上15%的随机噪声。最后构造为1×64×64×1的结构。
我们把测试数据放入到训练好的模型进行预测处理。最后我们使用matplotlib来画出地震数据处理的效果图。
现在我们来看看最后的处理效果。
左边是干净的原始测试信号,中间是加上了随机噪声的信号,右边是去掉噪声的信号。从上面的结果来看,这次的实验加的噪声比较大,噪声对原始信号造成了较大的干扰。神经网络模型对信号噪声去除效果比较明显。不过处理的结果对信号的还原还不是非常完美,在边缘部分还有些模糊。
今天我们将自编码理论应用到了去噪的实际应用中。在处理过程中遇到的问题远多于处理理想数据。这次使用的是仿真数据,在处理真实地震数据时遇到的问题还要多,这需要大家耐心的分析问题原因,不断的调优模型。最后给大家留一个思考问题,在训练数据的使用过程中,我们的方案是训练数据和标签数据都用的含噪声的训练集。那还有没有其他的训练方式呢?比如训练数据和标签数据都用不含噪声训练集,或者训练数据含噪声,标签数据不含噪声,效果会有什么不同呢?大家可以自己做实验思考。
以上就是今天的全部内容,如果你想获取代码,或有问题讨论,都欢迎联系我交流。下节课再见。
如果喜欢请点赞,或关注我交流。
网友评论