DL-FWI基础入门培训视频学习3——InversionNet

InversionNet:深度学习实现的反演

面向数据集: OpenFWI中的Vel, Fault, Style类

InversionNet构建了一个具有编码器-解码器结构的卷积神经网络,以模拟地震数据与地下速度结构的对应关系。

编码器主要是用卷积层构建的,它从输入的地震数据中提取高级特征,并将它们压缩成单一的高维向量。
采用的是非方形卷积,主要起到了压缩空间的作用,因为输入的地震波形图像的时间维度(图像的高)的尺度过大

DL-FWI基础入门培训视频学习3——InversionNet_第1张图片

这个高维向量是由1*1的图块构成512通道张量。可以将其认为是一个512维的向量.这样压缩信息是是合理的,因为没有必要保留地震数据中的时间和空间相关性(1*1是对空间信息有一定程度的舍弃)。

编码过程如下:
DL-FWI基础入门培训视频学习3——InversionNet_第2张图片

:并没有使用原论文中提到了1000*32的数据,而是1000*70的OpenFWI中的数据。因此这里采用的代码是参照OpenFWI论文(2022)中公开的InversionNet修改版代码,在这个代码里面的卷积过程与原2019年发布的InversionNet论文中所示的架构存在一定程度的差异。

解码器通过一组反卷积将这些特征转换成速度模型。反卷积(转置卷积)可以将图像的维度进行升维,同时最大程度保留图像原本性质。这可以通过在输入特征地图上填充零来实现,反卷积的效果比一般的反池化操作拥有更好的效果。

DL-FWI基础入门培训视频学习3——InversionNet_第3张图片

架构中给出h和w是方便用户适配更多速度模型环境,对于70*70的速度模型,作者给出的h=w=5,这样模型最终输出的尺寸就是80*80,通过裁剪得到70*70。

网络结构中展示的每个卷积操作实质上都是由卷积层,批归一化(BN)和LeakyReLU共同构成组成。

卷积层中,卷积承担输入信号的责任,同时担任滤波器的作用以提取有意义的特征。
卷积是应用于我们的问题的理想方法,因为地震测量在空间上是连续的,而卷积层的局部连通性和权重共享使得特征提取有效和高效。

批量归一化(Batch Normalization)表明,如果网络的输入具有零均值,单位方差和去相关,则深层网络的收敛速度会加快。有关进一步表明,使中间层的输出具有这些属性也是有利的。批处理归一化就是这样一种技术,它用于在每次迭代时,对馈送到网络中的中间层的数据子集在输出进行归一化。

用于解决ReLU的神经元死亡现象,LeaklyReLU被提出。
LeaklyReLU通过把x的非常小的线性分量给予负输入\alpha 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)

损失函数: 

DL-FWI基础入门培训视频学习3——InversionNet_第4张图片

y_{i}是真实速度模型,z_{i}预测速度模型,n是速度模型中空间像素的数量。输出的最后,我们会裁剪输出层以符合目标速度模型的大小。

DL-FWI基础入门培训视频学习3——InversionNet_第5张图片
 使用L1损失训练的CNN无法完全捕捉速度模型的结构特征,因为它没有对每个位置之间的相互作用进行建模。为了更好地反映地质特征,即速度在每个地下层内保持一致,我们构建了一个局部连接的CRF(Conditional Random Fields)来改进CNN预测的速度模型。

后续了解pytorch构建CNN的流程 。


 

你可能感兴趣的:(视频学习总结,学习)