地震去噪的新探索(ⅱ)——无监督卷积神经网络优化实践
自从投入到自编码的深度学习研究,一路跌跌撞撞。
上一篇文章用地震信号对自编码卷积神经网络去噪(见《地震去噪新探——无监督卷积神经网络实战》),结果悲剧了。如下图所示,上面是噪点贴图,下面是去噪贴图:
从去噪效果来看,只能得到一些碎片化的有效信号,是完全不能接受的效果图。
卷积神经网络不是更能学习特征细节,性能更好吗?为什么我做出来的效果这么惨?
之前的参数设置包括:使用10000 28*28训练块,训练历元:5,学习率:0.001,优化器:TF。火车。亚当优化器(学习)。最小化(成本),损失函数:TF . nn . sigmoid _ cross _ entropy _ with _ logs(labels = targets _,logs = logs _),成本= tf.reduce_mean(损失)。
网络结构图如下:
培训损失曲线:
1.标准化优化
可怕的损失训练结果引起了我的注意。拿收敛失败的问题到网上找答案,有大神说这是归一化没做好。
然后先做两个优化:
一种是将训练样本的取值范围控制为(-1,1),使用方法是原始值除以最大值的方法,像这样:
noise _ imgs = noise _ imgs/ABS(noise _ imgs)。最大()
第二种是在训练网络的每次卷积后加上BN,就像这样:
conv 1 = TF . layers . conv 2d(inputs _,64,(3,3),padding='same ',activation=tf.nn.relu)
conv 1 = TF . layers . batch _ normalization(conv 1,training=True)
进一步训练后,效果并不明显,仍然没有收敛。
此外,许多归一化方法侧重于(0,1),并使用此算法:
imgs =(imgs-imgs . min())/(imgs . max()-imgs . min())#归一化为[0,1]
原来地震数据根本没有训练,曲线是这样的:
2.学习功能的调整
如果一个计划失败,将重新生成一个计划。
我想对优化器和损失函数进行修改。
在神经网络学习中,损失函数的作用是衡量神经网络输出的预测值,计算值与实际值之差可以说是实现学习的关键函数。常见的损失函数有:最小二乘损失函数、交叉熵损失函数、回归中使用的光滑L1损失函数等。
优化函数的原理是将神经网络最外层的损失值转移到前面实现反向传播学习,这是实现神经网络连续学习和收敛的关键。比如最基本的梯度下降算法有:随机梯度下降算法、批量梯度下降算法、驱动量梯度下降算法、Adagrad、Adadelta、Adam等等。
然后我将从优化器函数开始。
既然学习率是0.001,不能收敛,那就试试0.0001。结果真的收敛了,如下图:
预测效果如何?结果一塌糊涂,连基本特征都学不会,如下图:
这是怎么回事?我的理解是,如果学习率太高,神经网络会学习到更多的细粒度特征,失去我们想要的特征。相当于研究一个人的特点。我们通常从五官、体型等方面来看,但如果从细胞的角度来研究,就无法还原人的外貌特征。
另外,设为0.0005也好不到哪里去。
改变损失函数可以吗?
比如把它改成soft max _ cross _ entropy _ with _ logits,像这样:
loss = TF . nn . soft max _ cross _ entropy _ with _ logits(labels = targets _,logits=logits_)
结果就是学不会,如下图:
3.其他尝试
两把斧头过去了,没有好转的迹象。我没有放弃。我开始思考为什么原来的程序训练Mnist效果那么好,为什么不转行做地震数据训练呢?
我想是不是训练样本数据有问题。我再次尝试了以下方法:
一、调整训练样本数据的大小:有128 * 128,40 * 40,32 * 32,28 * 28等。
二是截断样本数据:地震数据不是有很多异常值和较大偏差吗?我会过滤掉数据集中90%的区间,截断区间外的部分,然后归一化。所以数据分布要均匀得多。
三是扩大抽样数据来源,从不同数据来源抽样。数据更丰富训练效果会提高吗?
……
你可以想象做这些实验有多琐碎复杂,但现实就是这么无情。最后的结局是失败,根本没有像样的效果,甚至没有一个明确的结果。
“没有水就没有怀疑的路,还有另外一个村子。”
被现实在地上蹭了n天之后,我从一次惨痛的经历中学到:解决的方向在哪里?
在现有的无望神经网络中,提高学习速率可以收敛,但无法学习到有效特征。降低学习率可以学习到有效的特征却无法收敛,也就是说无法继续优化学习。整个事情变得自相矛盾。
面对这个难看的预测结果图,我意识到可能是网络结构本身有问题。很可能网络对学习图片数据有效,对学习地震数据无效。
看了其他研究者的论文,我逐渐专注于一个结构——解码。我的程序在这部分使用了卷积核上采样的结构。像这样:
con v4 = TF . image . resize _ nearest _ neighbor(con v3,(8,8))
conv4 = tf.layers.conv2d(conv4,32,(3,3),padding='same ',activation=tf.nn.relu)
但是其他地震论文的结构中包含了一个我没有的结构——反褶积。
如果我也用反卷积,甚至只用卷积和反卷积这种最简单的自编码结构呢?像这样的结构:
x = Conv2D(32,(3,3),activation='relu ',padding='same')(input_img)
x = Conv2D(32,(3,3),activation='relu ',padding='same')(x)
x = conv 2d transposation(32,(3,3),padding =' same ',activation =' relu ',kernel _ initializer = ' glorot _ normal ')(x)#反卷积。
x = Conv2DTranspose(32,(3,3),padding='same ',activation='relu ',kernel _ initializer = ' glorot _ normal ')(x)
decoded = conv 2d transpose(1,(1,1),padding='same ',activation='tanh ',kernel _ initializer = ' glorot _ normal ')(x)
结果是惊人的。下图是收敛的效果,很快就会收敛:
培训的效果更好。下面分别是原始图像、噪声图像和去噪效果图像:
如你所见,上面的噪音几乎淹没了有效信号。然后通过训练,只需要5次迭代,就可以很好的分离出有效信号。
“既然选择了远方,就只会在乎其中的艰辛。”
看来反褶积是解决地震学习的一把钥匙。接下来我会研究反褶积能适应地震处理的原因,然后继续优化创新,用其他算法做对比实验,以期做出更好的结果。
如果喜欢,请点击“喜欢”。如果你对该计划感兴趣,可以联系我获取。