各位同学,大家好。前期科技州推出了课程《智能地震相预测:教你用深度学习进行工区地震相预测》,为研究储层预测的同学们带来了新思路。不过有同学提出程序操作和理解起来有些困难,今天我们就通过视频讲解,全流程给大家演示运行程序的方法。
01 环境的配置
1.基本程序环境
我们的课程主要都是在Python环境下运行的,所以大家需要配置Python相关运行环境。我们常用Anacoda 的Spider作为集成编辑器。这款软件既是免费软件,也具有较好的调试功能。
另外我们的课程涉及深度学习的内容比较多,我们会用到tensorflow和keras,这也请大家自行安装。
以下是我们推荐的程序和引用库版本。
Python 3.8
keras 2.3.1
tensorflow 2.2.0 或 tensorflow-gpu 2.2.0
另外特别提示:
强烈建议大家配置具有独立NVIDIA显卡的运行环境,并装好CUDA驱动和Python的tensorflow-gpu版本,充分使用GPU加速计算。
后续我们课程中有关深度学习的处理,特别是储层的处理,使用GPU加速比CPU会快很多个数量级。
2.本课程用到的引用库
这本次课程中,我们还会用到几个引用库。
一是h5py库,主要功能是制作数据集和保存数据集为h5格式,它的优势:速度快、压缩效率高。尤其是在处理深度学习的大量图像时,常常用到。
安装方法
pip install h5py
二是imblearn库,主要是解决不平衡数据处理的问题。其基于机器学习常用sklearn开发而 成,使用方法和sklearn库十分相似,上手非常容易。
安装方法
pip install imblearn
三是livelossplot库,这是一个为深度学习框架提供回调函数,可以实时更新当前的机器学习评价指标并绘制成曲线图。
安装方法
pip install livelossplot
四是matplotlib,主要功能是提供绘制各种图像的模块,用于数据的分析和展示。
安装方法:
pip install matplotlib
本次课程这几个引用库的推荐版本是:
h5py 2.10.0
imblearn 0.0
livelossplot 0.5.5
matplotlib 3.3.3
02 程序运行
1.程序结构
本次课程运行的结构如图所示:
前面有三个文件夹。第一个文件夹data是存放了各类数据。其中raw文件夹放置了原始数据集文件,train_seismic.npy和train_labels.npy,分别为训练地震数据体和对应的地震相分类标签。同样,test1_seismic.npy和test1_labels.npy,分别为预测地震数据体和对应的地震相分类标签。interim文件夹存放了针对神经网络模型处理的数据集。processed文件夹存放的是经过类别均衡化处理的数据集。
models文件夹存放的是训练好的神经网络模型。
src文件夹存放了一些调用函数。plotting.py是用于输出一些结果的函数,包括混淆矩阵图、类别图、精度计算结果等。sequences.py是序列化程序,没有用到。utils.py是工具程序,在制作训练集分类中会用到。
接下来就是我们要运行的程序了。
2.程序运行
本次程序运行环境为:
Python 3.8
Anaconda 3 Spyder 4.1.5
接下来就详细讲解程序运行。
(1)make_dataset.py
这个程序是用来构建数据集。
首先定义了生成训练数据集和测试数据集的函数。
然后定义了初始参数。
接下来随机选择7个测井的数据来生成训练集。这样相当于模拟在工区打下了7口测试井,然后关联测井的地震相情况。然后通过将数据切割为32×32的小块和标签来生成训练集数据。这里为了适应模型的训练,使用小块的尺寸是32×32。再将训练集数据进行了保存。
同样的原理,使用数据test1_seismic.npy和test1_labels.npy来生成测试集数据。不过如果测试数据区域较大,生成的测试集数据量将很大,像我们普通的工作站无法承受。因此我们切割了部分区域的测试集数据。最后也将测试训练集进行了保存。
(2)process_dataset_f3.py
在大多数情况下,准备的训练数据分类不会平衡,会影响模型的泛化性。因此我们编写了程序来解决此类问题。
经过了参数初始化和读取训练集和测试集数据后,我们可以查看原始数据的分类状态。可以看到,训练数据有6类,测试数据有5类,都分布得很不均匀。
为了避免网络训练中的偏差,我们需要平衡数据,采用了随机过采样方法。通过程序的随机采样后,训练数据分类就成了下面的情况,这样就均衡了很多。
为了适用于神经网络模型进行训练,我们要制作训练集和验证集。我们在原训练集中抽取20%的数据用于验证,创建两个不同的集合。生成的两个集合的数据类别也相对比较均衡。
最后把数据保存到process文件夹。这里对地震数据进行了归一化处理,对地震相标签根据总的类别转换为onehot编码,方便后面神经网络模型训练。
(3)train_f3_32.py
这部分开始了对神经网络模型进行训练。
首先加载数据,定义了神经网络模型的结构。模型主要结构为二维卷积神经网络,中间激活函数使用relu,使用2×2的最大池化层来提取特征。使用Dropout(0.2)来降低过拟合风险。对于多分类问题,最后一层使用softmax来激活,loss函数使用categorical_crossentropy,优化器使用rmsprop。
预设使用30个迭代来训练数据,每个批处理大小为32,并且设置连续3次验证Loss值低于0.01时退出训练。这是为了防止过拟合发生。每个训练周期的曲线图都可以看到。最后保存模型。
(4)test_f3.py
为了检验模型的预测效果,我们把训练好的模型用于测试集地震数据的地震相预测,再与标签数据进行对比。
训练集数据用的是data/processed文件夹中的:f3_32_test.h5,这是前面在process_dataset_f3.py程序中处理好的测试数据集。
这个测试数据集只有5个类别。
然后调用训练模型进行地震相的预测。
通过标签数据和相关函数,我们可以计算预测的精度。从结果来看,本文模型的准确率达到了近90%,说明整体预测能力比较好。但是其它几个参数较低,说明在细节的预测能力上还有改进空间。当然,这个结果与预测数据集不均衡性有较大关系。
还可以画出混淆矩阵。从混淆矩阵结果来看,Lower North的预测准确性较高,这是因为这个类别数量最多。
最后,我们还可以画出预测的图形,包括原始的地震剖面,标签的地震相和预测的地震相。
(5)predict_f3.py
test_f3.py程序在预测过程中,使用了process_dataset_f3.py处理好的测试数据集。如果我们拿到一个新的地震数据,希望在一个程序中完成数据集制作和测试,就可以使用predict_f3.py这个程序。
首先是参数初始化,调用data/raw文件夹中的原始地震数据。
然后对地震数据进行归一化处理和截取。
接下来根据自己设定的一段范围来生成预测数据集。然后调用模型进行预测,并保存数据。
最后,我们画出预测的图像,包括了原始的地震剖面和预测的地震相。
通过以上的讲解,相信大家对整个地震相的程序预测过程比较清楚了,结合原来的课程了解地震相的基础知识,相信对大家研究地震相预测有比较大的帮助。如果大家对程序感兴趣,请联系我交流讨论。
我是科技州,用心分享智能地震勘探干货,带你一同进步。再见。
相关阅读:
网友评论