InversionNet:深度学习实现的反演
面向数据集: OpenFWI中的Vel, Fault, Style类
InversionNet构建了一个具有编码器-解码器结构的卷积神经网络,以模拟地震数据与地下速度结构的对应关系。
编码器主要是用卷积层构建的,它从输入的地震数据中提取高级特征,并将它们压缩成单一的高维向量。
采用的是非方形卷积,主要起到了压缩空间的作用,因为输入的地震波形图像的时间维度(图像的高)的尺度过大。
这个高维向量是由1*1的图块构成512通道张量。可以将其认为是一个512维的向量.这样压缩信息是是合理的,因为没有必要保留地震数据中的时间和空间相关性(1*1是对空间信息有一定程度的舍弃)。
注:并没有使用原论文中提到了1000*32的数据,而是1000*70的OpenFWI中的数据。因此这里采用的代码是参照OpenFWI论文(2022)中公开的InversionNet修改版代码,在这个代码里面的卷积过程与原2019年发布的InversionNet论文中所示的架构存在一定程度的差异。
解码器通过一组反卷积将这些特征转换成速度模型。反卷积(转置卷积)可以将图像的维度进行升维,同时最大程度保留图像原本性质。这可以通过在输入特征地图上填充零来实现,反卷积的效果比一般的反池化操作拥有更好的效果。
架构中给出h和w是方便用户适配更多速度模型环境,对于70*70的速度模型,作者给出的h=w=5,这样模型最终输出的尺寸就是80*80,通过裁剪得到70*70。
网络结构中展示的每个卷积操作实质上都是由卷积层,批归一化(BN)和LeakyReLU共同构成组成。
在卷积层中,卷积承担输入信号的责任,同时担任滤波器的作用以提取有意义的特征。
卷积是应用于我们的问题的理想方法,因为地震测量在空间上是连续的,而卷积层的局部连通性和权重共享使得特征提取有效和高效。
批量归一化(Batch Normalization)表明,如果网络的输入具有零均值,单位方差和去相关,则深层网络的收敛速度会加快。有关进一步表明,使中间层的输出具有这些属性也是有利的。批处理归一化就是这样一种技术,它用于在每次迭代时,对馈送到网络中的中间层的数据子集在输出进行归一化。
用于解决ReLU的神经元死亡现象,LeaklyReLU被提出。
LeaklyReLU通过把x的非常小的线性分量给予负输入来调整负值的零梯度问题;此外其也扩大的函数的y的范围。
# 对于一次卷积操作进行封装
NORM_LAYERS = {'bn': nn.BatchNorm2d,'in': nn.InstanceNorm2d,'ln': nn.LayerNorm}
class ConvBlock(nn.Module):
def__init__(self,in_fea,out_fea,kernel_size=3,stride=1,padding=1,norm='bn',relu_slop=0.2,dropout=None):
'''
Standard convolution operation
: param in_fea: Number of channels of input
: param out fea: Number of channels of output
: param kernel_size: Size of the convolution kernel
: param stride: Step size of the convolution
: param padding: Zero-fill width
: param norm: The means of normalization
: param relu_slop: Parameters of relu
: param dropout: Whether to apply dropout
'''
super(convBlock,self)._init_()
# 构造卷积
layers = [nn.Conv2d(in_channels=in_fea, out_channels=out_fea, kernel_size=kernel_size, stride=stride, padding=padding)]
# 批归一化层
if norm in NORM_LAYERS:
layers.append(NORM_LAYERS[norm](out_fea))
# 激活函数层
layers.append(nn.LeakyReLU(relu_slop, inplace=True))
if dropout:
layers. append(nn.Dropout2d(0.8))
self.layers = nn.Sequential( *layers)
def forward(self,×):
'''
:param x: Input Image
:return:
'''
return self.layers(x)
损失函数:
是真实速度模型,预测速度模型,n是速度模型中空间像素的数量。输出的最后,我们会裁剪输出层以符合目标速度模型的大小。
使用L1损失训练的CNN无法完全捕捉速度模型的结构特征,因为它没有对每个位置之间的相互作用进行建模。为了更好地反映地质特征,即速度在每个地下层内保持一致,我们构建了一个局部连接的CRF(Conditional Random Fields)来改进CNN预测的速度模型。
后续了解pytorch构建CNN的流程 。