2024 3.16~3.22 周报

一、DenseNet模型讲解

DenseNet架构:以前馈的方式,将每层与每层都连接起来,它建立的是前面所有层与后面层的密集连接(dense connection)。

  1. 为了确保最大程度的信息在网络中各层之间流动,将所有层彼此直接连接。 即每一层之间以及每一层和它的后续层都有连接。
  2. 为了保留前馈特性,每个层都从所有先前的图层获取附加输入,并将其自身的特征图传递给所有后续层
  3. 第L层具有L个输入,由所有前面的卷积块的特征图组成。它自身的特征图被传递到所有后续层。这样一个L层的网络中就具有 L(L+1)/2个连接。

  • 与ResNets相比,不会将特征传递到图层之前通过求和来组合特征。相反,通过级联特征来组合它们。通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能。
  • 这种密集的连接模式与传统的卷积网络相比,需要更少的参数,因为它不需要重新学习冗余的特征图。
  • DenseNets还改善了整个网络中的信息流和梯度,这使它们易于训练。每层都可以直接从损失函数和原始输入信号访问梯度,从而导致隐式深度监督。这有助于训练更深层次的网络体系结构。

  • 密集连接还具有正则化效果,从而减少了训练集大小较小的任务的过度拟合。

1 公式:

当标准神经网络的输入和输出的公式是X_{i}=H_{i}(X_{i-1}),其中H_{i}是一个组合函数,通常包括BN、ReLU、Pooling、Conv操作,X_{i-1 }是第 i 层输入的特征图,X_{i}是第 i 层输出的特征图。

对于DesNet,则是采用跨通道concat的形式来连接,特征传递方式是直接将前面所有层的特征concat后传到下一层。

公式:X_{i}=H_{i}(X_{0},X_{1},...,X_{i-1})

注:所有的层的输入都来源于前面所有层在channel维度的拼接。

DenseNet的前向过程如下图所示,可以更直观地理解其密集连接方式,如h_{3}的输入不仅包括来自h_{2}x_{2},还包括前面两层的x_{0}x_{1},它们是在channel维度上连接在一起的。

 

 DenseNet的前向过程

因为是直接跨通道直接做concat,所以要求不同层concat之前他们的特征图大小应当是相同的,所以DenseNet分为了好几个Dense Block,每个Dense Block内部的feature map的大小相同,而每个Dense Block之间使用一个Transition模块来进行下采样过渡连接。 

为什么DenseNet的参数量较其他模型大大减少? 

——这是由于每一层都包含之前所有层的输出信息,因此其只需要很少的特征图就够了。 


2 DenseNet的网络结构:

主要由Dense Block+Transition组成。

  • DenseBlock(定义了输入输出如何连接) 是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。
  • Transition模块(控制通道数) 是连接两个相邻的Dense Block,并且通过Pooling使特征图大小降低。

   CNN网络一般要经过Pooling或者stride>1的Conv来降低特征图的大小,而DenseNet的密集连接方式需要特征图大小保持一致

        为了解决这个问题,DenseNet网络中使用DenseBlock+Transition的结构,其中DenseBlock是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。而Transition模块是连接两个相邻的DenseBlock,并且通过Pooling使特征图大小降低。

        下图给出了DenseNet的网络结构,它共包含4个DenseBlock,各个DenseBlock之间通过Transition连接在一起。

 使用DenseBlock+Transition的DenseNet网络 

a.Dense Block

growth rate

        DenseBlock中的非线性组合函数H\left ( \cdot \right ) 采用的是BN+ReLU+3x3 Conv的结构,如下图所示。所有DenseBlock中各个层卷积之后均输出k个特征图,即得到的特征图的channel数为k,或者说采用k个卷积核。

        假如输入特征图的channel为K_{0},那么第 i 层的channel数就为K_{0}+(i-1)K,我们将K称之为网络的增长率(growth rate),这是一个超参数。一般情况下使用较小的 K(比如12),就可以得到较佳的性能。因为每一层都接受前面所有层的特征图,即特征传递方式是直接将前面所有层的特征concat后传到下一层,所以这个K不能很大。尽管K设定得较小,DenseBlock的输入会非常多,不过这是由于特征重用所造成的,每个层仅有K个特征是自己独有的。

注:这个K的实际含义就是这层新提取出的特征。

DenseBlock中的非线性转换结构

Bottleneck层

  • 目的:尽管每个层都只能产生K个输出特征,但是因为累计原因输入特征却有很多。由于后面层的输入会非常大,Dense Block内部可以采用bottleneck层来减少计算
  • 方法:可以在每个3×3卷积之前引入1×1卷积作为bottleneck层,以减少输入特征映射的数量,从而提高计算效率。即组合中包含的操作有BN+Relu+1×1conv+BN+Relu+3×3conv,把这样的网络结构叫做DenseNet-B。其中1x1 Conv得到 4k 个特征图它起到的作用是降低特征数量,从而提升计算效率。

使用bottleneck层的DenseBlock结构 

b.Transition层

  • 原因:特征图在各层的尺寸不同,不能直接concat。如果直接横跨整个也确实不方便。
  • 目的:将DenseNet划分为多个Dense Blocks,而块之间的称为转换层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。另外,Transition层可以起到压缩模型的作用。
  • 方法:用于卷积和池化,转换层包含的操作有BN+ReLU+1×1Conv+2×2AvgPooling

补充Transition层可以起到压缩模型的作用:

假定Transition的上接DenseBlock得到的特征图channels数为m ,Transition层可以产生\theta _{m}个特征(通过卷积层),其中\theta \in (0,1]是压缩系数(compression rate)。

  • \theta =1时,特征个数经过Transition层没有变化,即无压缩,
  • \theta < 1时,这种结构称为DenseNet-C,论文中使用\theta =0.5

对于使用bottleneck层的DenseBlock结构和压缩系数小于1的Transition组合结构称为DenseNet-BC。


上图展示了具有三个密集块的DenseNet。两个相邻块之间的图层称为过渡图层,通过卷积和池化来更改feature-map大小。

3 总结DenseNet:

  • 密集块:DenseNet将网络分成多个密集块(Dense Block)。在每个密集块内,每一层都连接到前面所有的层。这种跳跃连接有助于解决梯度消失问题,因为每一层都可以直接访问之前层的梯度信息,使得训练更加稳定。
  • 特征重用性:由于每一层都与前面所有层连接,网络可以自动地学习到更加丰富和复杂的特征表示。有助于提高网络的性能,同时减少了需要训练的参数数量。
  • 过渡层:在密集块之间,通常会使用过渡层来控制特征图的大小,从而减少计算量。

优点:

  • 网络可以更好地利用浅层特征信息,从而提高网络的性能。
  • 网络具有更强的特征重用能力,可以减少参数数量,降低过拟合风险。
  • 网络训练更加稳定,可以缓解梯度消失和梯度爆炸等问题。
import torch
import torch.nn as nn
import torchvision
# noinspection PyUnresolvedReferences
from torchsummary import summary

print("PyTorch Version: ", torch.__version__)
print("Torchvision Version: ", torchvision.__version__)

# 可选择的densenet模型
__all__ = ['DenseNet121', 'DenseNet169', 'DenseNet201', 'DenseNet264']

'''-------------一、构造初始卷积层-----------------------------'''


def Conv1(in_planes, places, stride=2):
    return nn.Sequential(
        nn.Conv2d(in_channels=in_planes, out_channels=places, kernel_size=7, stride=stride, padding=3, bias=False),
        nn.BatchNorm2d(places),
        nn.ReLU(inplace=True),
        nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
    )


'''-------------二、定义Dense Block模块-----------------------------'''

'''---(1)构造Dense Block内部结构---'''


# BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv
class _DenseLayer(nn.Module):
    def __init__(self, inplace, growth_rate, bn_size, drop_rate=0):
        super(_DenseLayer, self).__init__()
        self.drop_rate = drop_rate
        self.dense_layer = nn.Sequential(
            nn.BatchNorm2d(inplace),
            nn.ReLU(inplace=True),
            # growth_rate:增长率。一层产生多少个特征图
            nn.Conv2d(in_channels=inplace, out_channels=bn_size * growth_rate, kernel_size=1, stride=1, padding=0,
                      bias=False),
            nn.BatchNorm2d(bn_size * growth_rate),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=bn_size * growth_rate, out_channels=growth_rate, kernel_size=3, stride=1, padding=1,
                      bias=False),
        )
        self.dropout = nn.Dropout(p=self.drop_rate)

    def forward(self, x):
        y = self.dense_layer(x)
        if self.drop_rate > 0:
            y = self.dropout(y)
        return torch.cat([x, y], 1)


'''---(2)构造Dense Block模块---'''


class DenseBlock(nn.Module):
    def __init__(self, num_layers, inplances, growth_rate, bn_size, drop_rate=0):
        super(DenseBlock, self).__init__()
        layers = []
        # 随着layer层数的增加,每增加一层,输入的特征图就增加一倍growth_rate
        for i in range(num_layers):
            layers.append(_DenseLayer(inplances + i * growth_rate, growth_rate, bn_size, drop_rate))
        self.layers = nn.Sequential(*layers)

    def forward(self, x):
        return self.layers(x)


'''-------------三、构造Transition层-----------------------------'''


# BN+1×1Conv+2×2AveragePooling
class _TransitionLayer(nn.Module):
    def __init__(self, inplace, plance):
        super(_TransitionLayer, self).__init__()
        self.transition_layer = nn.Sequential(
            nn.BatchNorm2d(inplace),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=inplace, out_channels=plance, kernel_size=1, stride=1, padding=0, bias=False),
            nn.AvgPool2d(kernel_size=2, stride=2),
        )

    def forward(self, x):
        return self.transition_layer(x)


'''-------------四、搭建DenseNet网络-----------------------------'''


class DenseNet(nn.Module):
    def __init__(self, init_channels=64, growth_rate=32, blocks=[6, 12, 24, 16], num_classes=10):
        super(DenseNet, self).__init__()
        bn_size = 4
        drop_rate = 0
        self.conv1 = Conv1(in_planes=3, places=init_channels)

        blocks * 4

        # 第一次执行特征的维度来自于前面的特征提取
        num_features = init_channels

        # 第1个DenseBlock有6个DenseLayer, 执行DenseBlock(6,64,32,4)
        self.layer1 = DenseBlock(num_layers=blocks[0], inplances=num_features, growth_rate=growth_rate, bn_size=bn_size,
                                 drop_rate=drop_rate)
        num_features = num_features + blocks[0] * growth_rate
        # 第1个transition 执行 _TransitionLayer(256,128)
        self.transition1 = _TransitionLayer(inplace=num_features, plance=num_features // 2)
        # num_features减少为原来的一半,执行第1回合之后,第2个DenseBlock的输入的feature应该是:num_features = 128
        num_features = num_features // 2

        # 第2个DenseBlock有12个DenseLayer, 执行DenseBlock(12,128,32,4)
        self.layer2 = DenseBlock(num_layers=blocks[1], inplances=num_features, growth_rate=growth_rate, bn_size=bn_size,
                                 drop_rate=drop_rate)
        num_features = num_features + blocks[1] * growth_rate
        # 第2个transition 执行 _TransitionLayer(512,256)
        self.transition2 = _TransitionLayer(inplace=num_features, plance=num_features // 2)
        # num_features减少为原来的一半,执行第2回合之后,第3个DenseBlock的输入的feature应该是:num_features = 256
        num_features = num_features // 2

        # 第3个DenseBlock有24个DenseLayer, 执行DenseBlock(24,256,32,4)
        self.layer3 = DenseBlock(num_layers=blocks[2], inplances=num_features, growth_rate=growth_rate, bn_size=bn_size,
                                 drop_rate=drop_rate)
        num_features = num_features + blocks[2] * growth_rate
        # 第3个transition 执行 _TransitionLayer(1024,512)
        self.transition3 = _TransitionLayer(inplace=num_features, plance=num_features // 2)
        # num_features减少为原来的一半,执行第3回合之后,第4个DenseBlock的输入的feature应该是:num_features = 512
        num_features = num_features // 2

        # 第4个DenseBlock有16个DenseLayer, 执行DenseBlock(16,512,32,4)
        self.layer4 = DenseBlock(num_layers=blocks[3], inplances=num_features, growth_rate=growth_rate, bn_size=bn_size,
                                 drop_rate=drop_rate)
        num_features = num_features + blocks[3] * growth_rate

        self.avgpool = nn.AvgPool2d(7, stride=1)
        self.fc = nn.Linear(num_features, num_classes)

    def forward(self, x):
        x = self.conv1(x)

        x = self.layer1(x)
        x = self.transition1(x)
        x = self.layer2(x)
        x = self.transition2(x)
        x = self.layer3(x)
        x = self.transition3(x)
        x = self.layer4(x)

        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x


def DenseNet121():
    return DenseNet(init_channels=64, growth_rate=32, blocks=[6, 12, 24, 16])


def DenseNet169():
    return DenseNet(init_channels=64, growth_rate=32, blocks=[6, 12, 32, 32])


def DenseNet201():
    return DenseNet(init_channels=64, growth_rate=32, blocks=[6, 12, 48, 32])


def DenseNet264():
    return DenseNet(init_channels=64, growth_rate=32, blocks=[6, 12, 64, 48])


'''
if __name__=='__main__':
    # model = torchvision.models.densenet121()
    model = DenseNet121()
    print(model)
    input = torch.randn(1, 3, 224, 224)
    out = model(input)
    print(out.shape)
    '''
if __name__ == '__main__':
    net = DenseNet(num_classes=10).cpu()
    summary(net, (3, 224, 224))

二、SVInvNet论文简介 

  • 标题:SVInvNet: A Densely Connected Encoder-Decoder Architecture for Seismic Velocity Inversion——SVInvNet:一种用于地震速度反演的密集连接编解码器体系结构
  • 作者:Mojtaba Najafi KhatounabadHacer Yalim KelesSelma Kadioglu
  • 发表:IEEE Transactions on Geoscience and Remote Sensing

论文组织如下:

  • 第一节简介。
  • 第二节介绍了相关工作,通过回顾相关文献和该领域的以往研究,为研究提供了背景。
  • 在第三节中,介绍作者的方法和实施细节。本节进一步分为几个小节,在这些小节中,讨论了数据集的准备,描述了速度模型和地震数据,并详细阐述了所提出的深度模型架构,包括密集块、编码器和解码器网络的细节。
  • 第四节专门介绍实验和结果,在这里分析了作者提出的方法的性能,提供了全面的实验结果和解释。
  • 最后,在第五节结束作者的工作。

主要思想:

  • 本研究提出了一种基于深度学习的地震速度反演方法,重点关注不同大小的有噪声和无噪声训练数据集。作者的地震速度反演网络(SVInvNet)引入了一种新的架构,该架构包含用密集块增强的多连接编码器-解码器结构。这种设计专门用于有效处理复杂信息,这对于解决非线性地震速度反演的挑战至关重要。
  • 此外,受到UNet架构的启发,编码器部分特定密集块的输出与解码器中对应的块相连接,以支持信息流。
  • 为了进行训练和测试,创建了不同的地震速度模型,包括多层、断层和盐丘类别。还研究了不同类型的环境噪声,包括相干噪声和随机噪声,以及训练数据集的大小如何影响学习结果。
  • 作者对五个训练数据集进行了实验,每个数据集都通过750到6000个样本的样本量差异来区分。并使用12000个样本的大型基准数据集进行测试。尽管与基线相比,SVInvNet的参数较少,但它使用该数据集实现了卓越的性能。SVInvNet的结果还与全波形反演(FWI)方法的结果进行了比较。比较分析清楚地表明了所提出的模型的有效性。


        与传统的CNN架构不同,DenseNet独特地在每个密集块的每一层与其后续层之间具有多个连接,从而有效地防止导数的衰减并加速信息流动。

        为了在研究中使用,作者手动准备了一个包含18000个标记数据的新数据集,将地震炮道集与速度模型配对。为了更接近地模拟真实数据,我们在合成数据中引入了相干和随机噪声,从而产生了额外的18000个噪声标记数据。我们对五个训练数据集进行了实验,每个数据集都通过750到6000个样本的样本量差异来区分。我们使用一致的测试基准评估了数据量对深度模型学习能力的影响,该基准是我们为公平评估模型的泛化能力而创建的。我们的测试基准包括12000对数据,其样本量远大于训练数据集。

论文的贡献可以概括如下:

  • 提出了一种专门为地震速度反演任务设计的新型端到端基于CNN的编码器神经网络架构(SVInvNet)。SVInvNet的特点是显著减少了参数数量,从而在保持高性能水平的同时提高了计算效率。
  • 提出了两个不同的大规模数据集,通过存在和不存在噪声来区分。在此背景下,准备了18000个成对的地震数据和速度模型以及18000个噪声对,并在本研究中使用。作者将很快公开此数据集。
  • 建立了一个全面的基准程序,用于对经过训练的深度学习模型进行精确评估和比较。作者的方法使用了比训练数据集大得多的基准测试集,增强了对模型在不同场景中的泛化能力的评估。
  • 全面分析了不同训练数据集大小对地震速度反演问题学习过程的影响。据我们所知,这是第一次在这个领域进行这样的分析。

三、方法

图1:图解说明了利用基于深度学习的模型进行地震速度研究的(a)正向建模和(b)反演过程。地震传播方程L便于地震数据的计算;然而,基于现有的地震数据,没有明确的方程可用于推导速度。 

        使用地震波场传播方程可以在速度模型中计算地震数据。如图1(a)所示,我们可以用一个操作符比如L来表示这个过程。

D = L(m_{v})        (1)

在上式中,D是地震数据,m_{v}是速度模型参数。在本研究中,L是二维声波方程(见方程7)。它可以通过不同的数值方法求解,但在图1(a)中没有等式或直接的方法来逆转L的方向。从数学上讲,L的逆向给出了m_{v},如方程(2)所示。

m_{v} = L^{-1}(D)        (2)

逆算子(表示为L^{-1})对于预测最适合经验地震数据的速度模型参数至关重要。这一过程代表了一个复杂的非线性反演问题,其中对速度参数的调整并没有表现为地震数据观测中的直接比例响应。此外,这个问题本身就是不适定的,因为它允许存在多组速度参数,这些参数可以产生等效的地震数据,从而使解决方案的唯一性和稳定性复杂化。 

        研究人员已经探索了各种方法来解决这个非线性逆问题。这些方法从利用式(1)在速度模型领域中通过调查来识别最佳速度模型的全局方法,到基于导数的方法。后者从初始模型\bar{m}_{v}开始,随后计算相应的地震数据\bar{D},并调整\bar{m}_{v}参数以最小化L(D-\bar{D})的局部梯度。最近的进展已经看到基于深度学习的技术的出现,为这个长期存在的问题提供创新的解决方案。


        深度学习模型可以用数学表示,如等式(3)所示:

F(D^{n},W)\rightarrow m_{v}^{n}        (3)

  • F表示负责将地震数据D^{n}转化为速度模型m_{v}^{n}的深度学习函数。W代表模型内的可学习参数或权重集合。若N为总训练数据集的数量,则每个单独的训练样本可以用n表示,即n ∈ N。
  • 函数F由多个神经网络层组成,每个层具有不同的深度和连接模式,从输入层延伸到输出层。输入数据通过这些层传播以产生输出。然后将该输出与真实值或目标进行比较,并利用损失函数量化它们之间的差异。深度模型的成功率受训练数据集的数量和综合性的影响。

        在这项研究中,震源均匀分布在速度模型上方,并以不同角度进行扫描,以产生地震炮道集。总共使用了20个炮点,产生了20个不同的地震炮道集。这些炮点道集作为输入提供给深度神经网络,相应的速度模型作为地面实况。

        在研究中,作者采用了基于卷积神经网络(CNNs)的深度模型,以建立地震数据特征(如直达波、反射、散射和潜在折射)与基础速度模型参数(如层间速度值、层数、层界面形状、盐丘和断层特性)之间的明确联系(图1(b))。

        为了实现这一点,作者设计了一个层次结构足够深的神经网络,以在训练过程中保持梯度流的完整性。在神经网络中引入了编码器-解码器框架,这使作者能够直接训练复杂模型,而无需进行初始数据处理或预处理。此外,通过整合密集网络结构,我们能够构建更健壮的神经网络层,同时确保梯度信号在通过网络时不会显著减弱。

A.数据集准备 

        为了建立训练和测试数据集,首先生成速度模型,然后生成地震炮道集。作者总共准备了18000个速度模型。这些模型分为五组,层数从4到8不等。每组进一步分为三个子组:分层、断层和盐丘,每个子组包含1200个模型。对于每个速度模型,计算了20个炮道集。每个地震数据具有1秒的时间维度,并且包括34个接收器。所有计算都是在恒定密度声学环境中进行的,速度值随着深度的增加而增加。

1) 速度模型:为了准备真实的速度模型,作者仔细检查了已发表的地层实例,并将地质原理纳入其方法中。因此,使用了倾斜、起伏的界面、具有不同角度和断层位移的正向和逆向断层,以及具有任意大小、形状和水平位置的盐体

为了制备类似地下地层的界面,作者使用各种数学函数(包括三角函数、多项式和对数函数)生成了116条不同的界面曲线。等式(4)至(6)显示了这些函数的三个例子。

\begin{matrix} \\ l_{1} = \sqrt{x} + 5\, log(15x+1)\, sin(0.14x)\, cos(0.3x+20)\; \; \; \; (4)\\ l_{2} = 0.09x^{2} - 3.6\, sin(0.6x+2) + 5(x+1.5) - 0.8x\; \; \; \; (5) \\ l_{3} = e^{(0.1x-0.11)} - 1.5\, sin(x-6) + 2.1\frac{x}{x+3}\; \; \; \;\; \; \; \;\; \; \; \;\; \; \; \;\; \; \; (6) \end{matrix}

界面被保存为整数值。速度模型是通过随机选择深度、界面形状和每个层的速度值创建的,该过程从顶层开始向下进行。这个速度层的过程在算法1中有所说明。在这个过程中考虑了两个原则。

  • 首先,速度值随着深度增加,这意味着下层的速度始终高于上层。
  • 其次,为了部分保持层间地质沉积逻辑,上方界面的形状受到下方界面的影响。因此,随机选择的界面会与下方的界面合并。层间速度值在[1500, 4000] m/s之间变化。

层间最小速度差为200 m/s。在密度恒定的介质中,层边界的速度对比度在确定反射系数方面起着至关重要的作用。特别是在具有较高速度数值的层内,小的对比会导致反射波幅值显著减小。速度模型的尺寸为100x100个网格点。

通过将断层线代码纳入准备好的分层模型算法中来创建断层模型。线的角度、断层类型(正常和逆冲)和断层走滑量是随机选择的。根据断层类型,模型的顶盖部分在断层线上方或下方移动。

为了构建具有盐丘的模型,至少会随机产生四个不同的高斯函数,并利用它们的组合。这种方法使得可以创建具有不同大小和形状的盐丘。盐顶的速度数值在[4350, 4550] m/s之间变化。盐丘侵入上覆盖的沉积物会改变上层的形状。为了在盐丘的上层诱发这种形变,我们采用了更宽的高斯函数。图2中展示了一些样本速度模型。

图2:来自作者数据集的样本;顶部:层状,中部:断层,底部:盐丘 速度模型样品。样品选自4层、6层和8层模型。该模型的空间分辨率为700×700m。 


2) 地震数据:在速度模型的上边界均匀分布了34个接收器和20个震源。为了捕捉速度模型的横向部分的数据,我们在初始和最终的网格点上都放置了接收器。鉴于接收器间隔为3个网格,并采用均匀分布设置,确定接收器的总数为34。震源位置从第三个网格点开始,并以5个网格的间隔延伸到第98个网格。在2D声学环境中,地震波场的时间进程由方程(7)计算得到。

\frac{\partial^P }{\partial t^2} - v^{2}(\frac{\partial^2 P }{\partial x^2} + \frac{\partial^2 P }{\partial z^2}) = S(t,x,z)        (7) 

  • 其中P是声波场,v是介质的地震速度,x和z是空间坐标,S是源函数,t是时间。
  • 方程(7)的数值解通过2D有限差分法在时间域中实现。在每个单独的接收器位置计算持续1秒的地震数据。主频为20Hz的Ricker子波作为震源。
  • 为了减少数值计算中的色散,以7米的间隔对空间环境进行采样,并考虑v_{min}=1500 m/s以及源频率(20 Hz),换句话说\Delta x=7m。为了简化计算,\Delta z = \Delta x
  • 考虑到\Delta x值和v_{max}=4550 m/s,为了确保数值计算的准确性,我们将时间采样间隔设置为1ms,总共1000个时间样本。
  • 为了最大限度地减少边界的影响,在每个速度模型的右侧、左侧和底部添加了20个网格点,并使用吸收边界条件。
  • 因此,为每个速度模型获取尺寸为[20,1000,34]的地震数据图3显示了与随机选择的速度模型相对应的第1、第10和第20道炮道集。


图3:速度模型及其相关的合成炮点在第1个(a)、第10个(b)和第20个(c)震源位置处。 


        为了部分减少合成地震数据和真实地震数据之间的差异,将相干噪声和随机噪声都添加到准备好的数据集中。

        相干噪声来源于表面波的特性。因此,以250至450m/s的速度值为特征的尖峰模式以在近端接收器处观察到最大振幅的方式产生。这些模式随着时间的推移而逐渐衰减。随后,将具有在8-17Hz之间随机选择的中心频率作为表面波源的Ricker子波与尖峰集合进行卷积。通过将这种随机算法应用于每个速度模型,产生了18000个相干噪声道集,展示了表面波的影响。 

        为了生成随机噪声,首先,生成具有随机选择的标准分布的白噪声,并创建零均值。在随后的阶段中,所产生的噪声的某些随机选择的段被赋予零值,并且它与正弦函数卷积,正弦函数的特征在于落在13-17Hz范围内的随机选择的频率值。然后将计算出的噪声数据添加到地震炮点道集,从而获得噪声数据集。随机、相干、无噪声和有噪声散粒道集的一个样本如图4所示。

图4:随机、相干、无噪声和有噪声道集的样本分别从左到右排列。


B.深度模型的架构

        在本研究中,作者以InversionNet深度模型的设计为基线。与InversionNet类似,我们使用一维CNN核来将输入数据的时间轴减少到初始四层内的接收器数量。然而,与InversionNet不同,我们不会将特征的大小缩小到6×6以下。这个决定是基于邻近地震记录的振幅包含了有关速度模型界面结构的关键信息的理解

  • 在作者设计的深度模型架构中(图6),编码器和解码器部分都由具有固定特征大小和过渡层的不同密集块图中描绘为蓝色块)组成,以加快信息流并防止反向传播过程中梯度的衰落
  • 此外,编码器段中密集块的某些输出与解码器部分中相同大小的特征级联。为了避免过度添加层,实验从浅层CNN模型开始。基于这些发现,通过在模型结构中加入新的层和密集块来实现后续的改进。
  • 由于我们的架构中密集块的结构化设计,我们可以扩展层的数量并连接它们的输出特征,而不需要逐渐增加通道大小。

图6:提出了用于地震速度反演的SVInvNet体系结构。 

1) 密集块结构:

在每个密集块中,有3个CNN层,其特征大小与初始层的特征大小相匹配。图5显示了第i个密集区块的示意图及其各层之间的连接。方程(8)-(12)在数学上描述了第i个密集块。

图5:有3层的密集块。 

\begin{matrix} x_{1}^{i} =L_{1}^{i}(x_{0})\; ;\; C_{out} = c_{1}& (8)\\ x_{2}^{i} =L_{2}^{i}(x_{1})\; ; \;C_{out} = c_{2} & (9)\\ x_{1,2}^{i} = concatenate(x_{1}^{i},x_{2}^{i}) &(10) \\ x_{3}^{i} =L_{3}^{i}(x_{1,2}^{i})\;;\; C_{out} = c_{3} &(11) \\ y_{0} = concatenate(x_{1}^{i},x_{2}^{i},x_{3}^{i})& (12) \end{matrix} 

这里,L_{j}^{i}是密集块i的第j层,x_{0}被输入到密集块,y_{0}是第i个密集块的输出;x_{j}^{i}是第j层的输出。c_{j}展示出了通道大小(即生成的特征图的数量),其确定了每一层中输出体积的深度。

在我们的架构中,c_{j}=64y_{0}具有192个特征图,并且L_{j}包含3×3卷积(Conv)、批处理归一化(BN)层和ReLU激活函数。为了方便起见,从现在起,在讨论中,这种组合conv2d、BN、ReLU将被称为Con2D。

在具有相同特征大小的密集块之间的过渡层中,输出的通道大小通常会减小(图6中的紫色立方体所示)。

2) 编码器网络:

        通过对最初四层使用1D-CNNs(图6中用橙色箭头表示),根据接收器的数量减少了输入数据的时间维度。换句话说,第四层的输出尺寸为34×34。

        随后,通过2D-CNNs的应用,数据维度逐渐减少到18×18、9×9和6×6。对于34×34维度,存在3个密集块,而对于其他维度,分别存在2个、1个和1个密集块。每个密集区块内有三个Conv2d层。每个层的输入包括前面的层的输出。因此,CNN内核能够利用在前面的层中提取的特征来访问低级别特征。

相同特征大小的密集块的输出被连接,随后被送入Conv2d层,通过超过1的步长值来减小它们的大小。因此,在从这些层过渡时,输出通道的大小会减小,并且这些层的输出被用作新密集块的输入。在图6中,这些层使用小的红绿色立方体来表示。
 

3) 解码器网络:

        在编码器模型的层内提取的特征被逐步缩放到9×9、18×18、34×34、51×51和100×100的维度,以构建与速度模型相对应的输出。对于尺寸34×34和51×51,每个使用2个密集块,而尺寸100×100使用1个密集块。按比例放大的过程发生在层内,包括上采样和Conv2D操作。(图6中的蓝色-黄色小立方体描绘了这些层。)

        为了便于信息传输过程并巩固解码器部分的特征,编码器部分中大小为18×18和34×34的密集块的输出也与解码器部分中的对应块级联。由于结合了密集块,这种架构能够增加信道大小,允许在不增加参数数量的情况下处理更大的特征大小。在输出层之前包含100×100的密集块被证明有助于提高深度模型的有效性。该密集块的输出经过Conv1×1 Sigmoid激活函数,产生深度模型输出(图6中用绿色箭头表示)。

        在这种提出的架构中,一方面,从地震数据中提取特征,并与速度模型的大小和维度对齐,而另一方面,这种对齐所需的基本信息可以很容易地在输入和地面实况之间传输。SVInvNet的参数数量约为400万。

        将该架构的输出与真实速度模型进行比较,并使用损失函数计算它们之间的差异。损失函数应该能够捕捉两个速度模型之间的速度值之间的差异以及界面和地质结构的形状。因此,在该架构的这一部分中,我们使用平均绝对误差(L1)和结构相似性指数测度(SSIM)作为损失函数,并使用两个系数(λL1和λSSIM)为它们中的每一个分配权重,以增强损失函数的导数。

四、实验和结果

  • 我们总共生成18000个数据样本,层数在4到8之间,每组有3600个模型,共5组。例如,在一个有七层的模型中,有三个不同的子组:致密层、断层和盐丘;每个子组1200个模型。
  • 从15种不同类型的数据中,随机选择800个模型作为测试基准。因此,测试数据集大小的总数为12000。
  • 数据集中的其余模型(即6000个模型)用作训练数据集。

        为了研究训练数据量的变化对地震反演过程的影响,作者准备了五个不同的训练数据集,并从每个子组中选择不同数量的子组,分别为50、100、200、300和400个模型。因此,我们进行了五个独立的训练过程,分别使用750(15×50)、1,500、3,000、4,500和6,000个训练数据集的规模,并使用我们准备的12,000个模型的相同测试基准评估了经过训练的深度模型。

        为了便于理解和使用,我们引入了命名法来表示不同的训练数据集。具体而言,我们分配罗马数字I-V来代表与样本规模750、1500、3000、4500和6000相对应的训练数据集。因此,这些数据集将分别被称为TD-I、TD-II、TD-III、TD-IV和TD-V。

        测试数据的数量至少是训练数据集的两倍,从而能够研究训练的深度模型的泛化能力。例如,TD-IV包含每个速度子组的300个模型,就样本数量而言,它相当于测试基准规模的37.5%。在所有五个训练过程中,培训条件保持不变。对训练模型采用一致的命名法,我们将罗马数字I-V扩展到我们的指定训练模型。例如,Model-I将对应于使用TD-I训练的模型,以此类推。

        对于每个速度模型,计算具有34个接收器的20个炮道集,持续时间为1秒,时间采样间隔为1ms。源间隔为35米,接收器间隔为21米。因此,输入数据的大小为[20, 1000, 34],而地面实况数据(速度模型)的大小为[1, 100, 100]。

        作者根据各种实验的结果确定了网络超参数。对于优化,使用Adam优化器,批量大小为32,初始学习率设置为5e-3。在训练过程中,根据优化过程逐渐减小学习率。所有训练过程的epoch设定为500。深度模型的训练超参数如表I所示。

表I :训练超参数

        为了在测试阶段计算预测的速度模型与真实速度模型之间的不匹配和相似性,我们利用了平均绝对误差(L1)和均方误差(L2)、结构相似性指数测度(SSIM)和多结构相似性指标测度(MSSIM)。成功估计速度模型的特征是较低的L1和L2值,以及较高的SSIM和MSSIM值。这些值是针对归一化数据集计算的。所有的训练和测试过程都在NVIDIA RTX A4500显卡上的GPU上执行,使用PyTorch库。

A.基线模型

        为了比较SVInvNet的性能,作者采用了Wu等人提出的InversionNet模型作为基线。李等人还使用InversionNet作为基线,并对其架构进行了某些修改。尽管略有差异,但李等人提出的体系结构比吴等人在我们的实验中提出的版本产生了更好的结果。两个版本的InversionNet的参数数都在4400万左右。

表II:使用无噪声TD-V训练的三个版本的InversionNet在测试数据集上的性能。 

        我们还对InversionNet进行了某些修改,从而产生了一个优于先前迭代的新版本(表II)。为了方便起见,我们使用α、β和γ来表示Wu等人[11]、Li等人[12]和我们的InversionNet模型变体。表III中的表格数据显示了基线和SVInvNet三次迭代中每一次的参数计数。

表III:参数计数

  •  至于修改,我们在InversionNet(α)的第四层用卷积函数替换了MaxPooling函数,并减小了特征大小,直到它达到4×4而不是1×1。
  • 此外,通过在模型的解码器段中用上采样卷积方法替换每个反卷积层,参数计数减少到2000万,从而增强了新版本的预测能力。

B.结果和讨论

        InversionNet的三个变体分别用TDV进行训练,并用我们的测试基准进行测试。为了检查损失函数的含义,训练阶段进行了两次,一次合并了L1损失函数,一次集成了L1和(1-SSIM)损失函数(如L1+SSIM)。测试阶段的不匹配和相似性度量的统计数据如表II所示。

        根据表II所示的研究结果,与版本α和β相比,反演网(γ)在获取地震数据到速度模型的定量映射方面表现出卓越的能力。此外,L1+SSIM损失函数有效地捕捉了深度模型的输出和真实速度模型间的差异,在这方面超过了唯一L1损失函数的性能。

        利用L1+SSIM损失函数在噪声数据集上进行附加实验。在这种情况下,我们利用有噪声的TD-V分别训练了三个版本的InversionNet。随后,我们采用噪声测试基准来建立测试过程。表IV中给出了使用四个度量的噪声测试集模型的性能。可以看出,我们的改进版本的InversionNet比InversionNet(α)表现出更好的性能,并且与InversionNetwork(β)表现出相似的性能。因此,我们使用InversionNet(γ)作为即将进行的实验的基准模型评估的基线。

表IV:使用噪声TD-V训练的三个版本的反演网在测试数据集上的性能。

        利用TD-I到TD-V的无噪声和有噪声版本,我们独立训练了SVInvNet,随后使用我们的测试基准评估了由此产生的五个训练的深度模型(模型I到模型V)中的每一个,该基准对于具有12000个数据对的所有模型都是相同的。

        无噪声数据集的测试阶段的不匹配和相似性值如表V所示。如预期的那样,训练数据集的体积增加对应于L1和L2的值的减少,同时SSIM和MSSIM的值增加。针对图7中聚合的三个选定模型,描述了训练期间训练和验证数据集上的L1和SSIM损失函数曲线。从图中可以明显看出,模型I表现出过拟合行为。然而,随着训练数据集大小的增加(参考模型V),这个问题显著减少。

表V:我们的深度模型在测试集上的性能。模型I-V分别使用无噪声TD I-V进行训练。 

        增加训练数据集中的样本数量导致损失函数值的减少、相似性度量的改进以及训练阶段持续时间的延长。根据表II和表V中的结果,很明显,我们提出的深度模型的性能超过了InversionNet。即使是用TD-III训练的SVInvNet的损失值,也表明与用TD-V训练的InversionNet(γ)的值相比具有优越的性能。换句话说,作者提出的深度模型可以比基线模型更低的损失函数,更好地将地震炮道集映射到速度模型。

图8:真实速度模型以及我们的模型I(第二列)、模型III(第三列)和模型V(第四列)的预测结果。最右边的一列显示了四个速度模型的地面实况模型中描绘的灰线处的垂直速度剖面。 

        图8描述了随机选择的测试样本对我们训练的模型的定性评估。每个样本都是有目的地从8层组中选择的,以展示更具挑战性的组在层状、断层和盐丘类别反演方面的视觉效果。这些样本的真实速度模型和模型I、模型III和模型V的预测结果如图8所示。

        在定性评估中,我们注意层的速度值和界面形状、断层线的连续性和投掷值以及盐丘的形状、位置和速度值。从样品中可以看出,层内的速度值保持不变。随着训练数据集大小的增加,该值近似值的差异减小,逐渐收敛到稳定不变的值。从右栏同一图中所示的速度剖面可以看出,与绿线(对应于模型III)相比,与模型I相关的蓝线表现出更明显的振荡,而绿线表现出比红线(模型V)更大的振荡行为。值得注意的是,在红线中可以观察到最小的振荡

五、结论

        在这项研究中,作者介绍了一种新的端到端深部地震速度反演模型SVInvNet。为了增强SVInvNet在学习和估计更复杂的速度模型方面的能力,作者避免仅仅增加CNN层的通道数量(即特征平面的数量),这会导致参数数量的过度增加。

  • 相反,作者设计了一种网络架构,其特征是其层之间的多个连接只有4M个参数。这种设计促进了信息在输入和相应的地面实况之间的有效流动。
  • 基于从有噪声和无噪声数据集得出的结果,SVInvNet证明了准确估计以多层结构、断层和盐丘为特征的速度模型的能力。此外,观察到训练数据集数量的增加与测试阶段损失函数的减少相关。测试数据集大小至少是训练数据集大小的两倍的利用率揭示了训练的SVInvNet产生的结果的全面性。
  • 从包含随机噪声和相干噪声的数据集获得的结果强调了SVInvNet有效过滤此类噪声类型并将地震数据映射到速度模型的能力。然而,在无噪声数据集中观察到的等效损失函数值需要在存在噪声的情况下使用更大的训练数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值