DL-FWI——数据驱动的全波形反演
目录
1. DL-FWI基础知识
1)何为全波形反演
2)FWI的数学表示(传统方式)
3)FWI的端到端深度学习解释
4)DL-FWI的基本发展和分类
5)地震数据(Seismic Data)、速度模型(Velocity Model)、道(Trace)
2. 数据中的信息与数据的运用
1)数据集:
2)数据的操作:读取
3)数据的操作:存储
4)数据的操作:展示
SEG地震数据注解:
OpenWFI地震数据注解:
SEG速度模型注解:
地质勘探过程中的关键问题——探究地下结构的构造
传统的FWI:使用声波方程或弹性波方程等波动方程来模拟地震波在地下介质中的传播过程。
大致过程: 根据一个初始的简化模型,使用声波或弹性波方程等进行正演模拟,得到模拟的地震波场数据(预测数据), 将观测的地震数据与模拟的地震数据之间的差异作为目标函数,使用优化算法(如梯度下降法)调整模型参数,使目标函数最小化,从而实现模拟数据与观测数据的匹配。
传统的FWI的求解方案是利用物理学上的波动方程(Wave Equation)来求解的,在这个过程中会通过多次迭代,吗,时间开销是巨大的, 而且依赖于初始解,存在病态性。
全波形反演的传统工作流程如下:
注:在机器学习中,端到端方法是直接从原始数据开始,自动地从输入数据中学习并提取有用的特征,并最终产生所需的输出结果,中间不需要人工设计特征或额外的处理步骤。
数据集本身是由若于个{ 地震数据-速度模型 }构成的数据对,任何一个地震数据必然有其对应的速度模型,反之亦然。
SEG盐体数据:描述了一个大约2km×3km的地下二维剖面区域。采样后(距离10m进行一个采样),地下的像素区域大小为201×301,波在这个地下区域的传播速度为1500m/s~4482m/s。
这个SEG盐数据是现实地下盐层三维分析数据通过剖面切片获得的,一共获得了140个切面数据。
图中黄色部分代表盐体(Salt Body),波在这个介质中的传播较快:
盐体:指地下储存着盐类矿物质的岩体,通常由氯化钠、硫酸钠、硼酸盐等组成。这些盐体往往形成在海洋或湖泊的底部,因为这些地方有更多的水分和盐分,有利于盐类矿物质的沉积和聚集。在一些地方,盐体可以被开采并用于食品加工、化学工业等领域。
SEG盐体数据的模拟数据:
地震波数据采集参数相关参数:
OpenFWI数据集:
目前,FWI的数据并没有统一的格式系统,以.mat和.npy为例。
import scipy.io
numpy_file = scipy.io.loadmat(mat_file)[ "var_name"]
import numpy as np
dataset = np.load(np_file)
地震数据的存储操作相对较少,但在长期训练过程中,额外保存中间变量可以节省时间操作,主要建议是通过.npy来进行保存(既方便写也方便读)。
import numpy as np
dataset = np.save(np_file)
(left, right, bottom, top)
:指定显示的范围,它表示左、右、下和上的坐标。subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None):调整子区的展现效果,值均为0~1之间,即控制图像留白区域。
def pain_seg_seismic_data(para_seismic_data):
'''
PLotting seismic data images of SEG salt datasets
: param para_seismic_data: Seismic data (4e0 x 3e1)(numpy)
: param is_coLorbar: whether to add a color bar (1 means add,0 is the defauLt,means don't add)
'''
fig,ax = plt.subplots(figsize=(6.2,8).dpi = 120)
im = ax.imshow(para_seismic_data,extent=[0,300,400,0],cmap=plt.cm.seismic,vmin=-0.4,vmax=0.44)
ax.set_xlabel( 'Position (km)',font21)
ax.set_ylabel( 'Time (s)',font21)
ax.set_xticks(np.linspace(0,300,5))
ax.set yticks(np.linspace(e,400,5))
ax.set_xticklabels(1abels = [0,0.75,1.5,2.25,3.0],size=21)
ax.set_yticklabels(labels = [0.0,0.50,1.00,1.50,2.00],size=21)
plt.rcParams ['font.size']= 14 #set colorbar font size
divider = make_axes_locatable(ax)
cax = divider.append_axes("top",size="3%",pad=0.32)
plt.colorbar(im,ax=ax,cax=cax,orientation='horizontal')
plt.subplots_adjust(bottom=0.08,top=0.98,left=0.11,right=0.99)
plt.show
附:Matplotlib 是 Python 生态系统的一个重要组成部分,是用于可视化的绘图库,它提供了一整套和 matlab 相似的命令 API 和可视化界面,可以生成出版质量级别的精美图形。
安装成功后,即可以在 Python 中像使用其它库一样导入和使用 Matplotlib,而无需更多文件的配置,通常我们将其导入后使用别名 mpl:
import matplotlib as mpl
def pain_openfwi_seismic_data(para_seismic_data):
'''
PLotting seismic data images of openfwi dataset
: param para_seismic_data: Seismic data (1eee x 70)(numpy)
'''
data = cv2.resize(para_seismic_data,dsize=(400,301),interpolation=cv2.INTER_CUBIC)
fig, ax = plt.subplots(figsize=(6.1,8),dpi = 120)
im = ax.imshon(data,extent=[0,0.7,1.0,0],cmap=plt.cm.seismic,vmin=-18,vmax=19)
ax.set_xlabel( 'Position(km)' , font21)
ax.set_ylabel( 'Time (s)', font21)
ax.set_xticks(np.linspace(0,0.7,5))
ax.set_yticks(np.linspace(0,1.0,5))
ax.set_xticklabels(labels=[0,0.17,0.35,0.52,0.7],size=21)
ax.set_yticklabels(1abels=[0,0.25,0.5,0.75,1.0], size=21)
plt.rcParams ['font.size']= 14 # Set colorbar font size
divider = make_axes_locatable(ax)
cax = divider.append_axes( "top", size="3%", pad=0.3)
plt.colorbar(im, ax=ax, cax=cax, orientation='horizontal')
plt.subplots_adjust(bottom=0.08,top=0.98,1eft=0.11,right=0.99)
plt.show()
def pain_seg_velocity_model(para_velocity_model,min_velocity,max_velocity):
'''
:param para_veLocity_model: veLocity model (200 x 301)(numpy)
:param min_velocity: upper limit of velocity in the veLocity modeL
:param max_veLocity: Lower limit of velocity in the veLocity modeL
:return:
'''
fig, ax = plt.subplots(figsize=(5.8,4.3),dpi=150)
im = ax.imshow(para_velocity_model,extent=[0,3,2,0],vmin=min_velocity,
vmax=max_velocity)
ax.set_xlabel( 'Position(km)', font18)
ax.set ylabel( 'Depth(km)', font18)
ax.tick_params (labelsize=14)
plt.rcParams [ 'font.size'] = 14 # Set colorbar font size
divider = make_axes_locatable(ax)
cax = divider.append_axes("top", size="3%", pad=0.32)
plt.colorbar(im, ax=ax, cax=cax, orientation='horizontal',
ticks=np.linspace(min_velocity,max_velocity,7))
plt.subplots_adjust(bottom=0.12,top=0.95,left=0.11,right=0.99)
plt.show()