随着深度学习算法的蓬勃发展,卷积神经网络(CNN)被大规模的应用在分类任务中,输出的结果是整个图像的类标签。后来在生物医学领域,医生需要对病灶区域进行病理分析。这时需要一种更先进的网络模型,通过较少数量的训练图片,就能预测像素点类别,并且可以对像素点进行着色绘图,形成更复杂的判断,这时Unet网络设计出来了。
地震勘探领域的断层识别,同样需要对断层位置进行精准判断,并画出断层线条甚至断面。越来越多的研究学者将Unet网络运用到地震勘探行业。
01 Unet神经网络断层识别原理
UNet网络结构最初由 Ronneberger 等人在2015年提出。该网络的核心思想是引入了跳跃连接,使得图像分割的精度大大提升。地震断层识别相比图像分割问题要简单一些,因此伍新明等教授对Unet网络进行了简化,使得更适用于断层的识别。
Unet网络的主要结构包括了编码器、解码器、瓶颈层三个部分。
(1)编码器部分:包括了三个程序块。每个程序块都包括3*3的卷积(使用Relu激活函数),步幅为2的2*2的池化层。每个程序块处理后,特征图逐步缩小。
(2)瓶颈层部分:包含了两个3*3的卷积层。
(3)解码器部分:与编码器部分对称,也包括三个程序块,每个程序块包括步幅为2的2*2的上采样操作,然后与编码部分进行特征映射级联(concatenate),最后通过两个3*3的卷积(使用Relu激活函数)。
最终输出层包含一个1*1的卷积层,其后紧跟sigmoid激活函数,生成二维断层概率图像。
UNet 网络结构的关键在于编码部分和解码部分的跳跃连接( Skip Connection),将来自解码器的深层高级特征与来自编码器的浅层低级特征相结合。编码器的浅层结构可以提取断层的简单特征,而深层结构则能抓取到断层的复杂特征。
02 实战案例应用
结合前期合成的地震断层数据作为模型训练的标签数据,我们构建一个完整的Unet神经网络作为训练模型,来给大家讲解Unet断层识别模型的构建过程。
为了能够流畅的运行,同样建议大家使用独立的显卡,并且支持CUDA GPU加速,显存8G以上,内存64G以上。
1.加载训练集数据
我们使用前期机器自动生成的数据集,包括200个样本的训练集和20个样本的验证集,每个样本的尺寸是128*128*128。
为了提高模型鲁棒性,还可以对训练数据进行增强处理。就是在加载仿真数据后,再对训练数据进行水平翻转多次翻转,进一步增加训练样本的多样性。
使用下面的程序。
2.构建Unet神经网络
根据前文的介绍,构建了一个Unet网络结构:
主要的代码包括编码、解码和瓶颈层三部分。编码部分的代码是这样的:
其中每个代码块的内容是这样的:
解码部分的代码是这样的:
其中每个代码块的内容是这样的:
瓶颈部分的代码是这样的:
训练参数部分:
由于整个地震数据中,断层部分很少,大部分都是非断层,造成了数据分布不均衡,因此这里修改了loss函数,优化了cross_entropy算法。
3.训练神经网络
整个网络训练了25个周期,平均每个周期训练时间10分钟左右。
训练准确率可以达到94.91%,验证准确率达到95.67%,可见鲁棒性较好,没有出现过拟合。
训练的图形是这样的:
从训练图像来看,训练曲线比较稳定,可以收敛。验证曲线不太稳定,说明模型还需要优化。
4.保存神经网络
我们可以将训练的模型保存下来,未来进行其它数据预测时可以直接调用模型。
5.识别效果
下面两张图显示了其中卷积层学习到的特征。
可以看到逐渐识别到了地震信号的特征。
仿真数据的识别效果见下图。
可以看到识别效果非常好,不管是主要断层还是细小的断层都能识别出来,也没有错误出现。
具体可视化显示断层的方法后续会介绍。
这次的课程就到这里。我们给大家讲解了建立Unet神经网络模型进行训练和断层识别的一套实战流程。如果大家对程序感兴趣欢迎联系我交流。再见。
扩展阅读:
网友评论