备案网站出售,施甸网站建设,哪里有微信网站开发公司,网站 默认首页一、前言 上周主要完成了SeisInvNet加强版论文的阅读#xff0c;并尝试跑了一下代码。 本周阅读师兄的论文《DD-Net》#xff0c;并尝试思考新的点子修改网络架构。
二、DD-Net阅读情况 标题#xff1a;Dual decoder network with curriculumlearning for full waveform in…一、前言 上周主要完成了SeisInvNet加强版论文的阅读并尝试跑了一下代码。 本周阅读师兄的论文《DD-Net》并尝试思考新的点子修改网络架构。
二、DD-Net阅读情况 标题Dual decoder network with curriculumlearning for full waveform inversion具有课程学习功能的用于全波形反演的双解码器网络DD-Net 期刊IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSINGIEEE地球科学与遥感汇刊 源代码github.com/fansmale/ddnet 本文设计了一个具有两个解码器的U形网络以获取速度模型的速度值和地层边界信息。解码器的反馈将在编码器处组合以增强边缘空间信息的编码。另外通过组织三个难度级别的数据将课程学习引入网络训练。由易到难的训练过程增强了网络的数据拟合。此外通过预网络降维器野外采集时采样点和检波器数量差异果茶共炮点道集图像纵横比过大通过多个卷积组成的降维结构来压缩时间维度将网络应用于低分辨率地震观测。在SEG盐数据集和OpenFWI的四个合成数据集上进行了实验。 在SEG盐和OpenFWI数据集上进行实验其中使用四个指标MSEMAEUIQ和LPIPS。同时使用两个DL-FWI网络—FCNVMB和InversionNet与DD-Net网络进行了比较。结果表明
1DD-Net网络在不同数据集上的表现优于同行; 2课程学习和DL-FWI的集成提高了网络的学习能力; 3双解码器有助于重建速度模型中的边缘细节; 4DD-Net网络对各种数据具有良好的泛化能力。
2.1 DD-Net网络架构 DD-Net的架构如下图所示其基本思想来自Unet具有明显的左右高度对称的编解码器结构整体结构呈Y形。 图1. 用于反演的DD-Net的深度网络架构。每个立方体的宽度表示图像中通道的数量在立方体下方以蓝色标记。黑色数字表示当前网络层的图像大小如400 × 301输入。图上方的箭头是卷积和池化操作的简化表示。其中红色箭头表示三个连续的固定操作即卷积BN批量归一化和ReLU。蓝色立方体代表编码器的信息橙色代表解码器。红色虚线框指示两部分通道的级联操作。黑色虚线箭头指示输入到解码器的特征的源在此期间原始解码器维度被扩展。 传统的U-Net进行图像分割时存在轮廓粗糙和不连续的问题。不同的解码器将U-Net变成一个多任务学习环境子任务解码器还可以为主任务或后续任务提供参数上下文。左侧的编码器组件负责地震数据的压缩过程将29炮的地震观测记录压缩成1024维的抽象结构化信息。右边的两个解码器使用不同的想法来解释高维抽象信息。第一解码器的目标是常规的速度模型是预测的主要解码器关注速度值的准确拟合。然后Canny轮廓提取后的二进制速度模型进一步用作第二解码器的拟合目标。该解码器将用作训练轮廓信息的辅助解码器。轮廓解码器以确保分割预测的平滑性。 网络中有两个基本操作即卷积和反卷积分别用于编码器和解码器。 (a)在编码器中重复卷积充分利用地震波形中的连续信息。BN在卷积后对输入网络的数据子集进行归一化从而提高收敛性。ReLU激活函数通过删除一些网络节点来保证层到层的非线性。同时通过多个ReLU的非线性叠加该深度网络可以近似波动方程的映射。 (b)在解码器中反卷积操作可以将高度压缩的信息扩展为更高分辨率的图像同时保留尽可能多的信息。跳跃连接用于获得更高分辨率的编码器特征。此外较浅的卷积层保留了不同炮之间的细粒度差异。因此作为附加通道的较浅层的特征图可进一步引导解码器描述重叠检测区域的边界信息。表I列出了神经网络的一些详细参数设置。
表1 DD-Net网络层详细配置 共炮点道集通常与极大的纵横比相关联。对于一些检波器数量较少的低分辨率观测值直接使用插值进行下采样可能会导致一些信息丢失。因此本文建立了一个修改版本的DD网络与降维器为1000×70低分辨率的观测根据检波器的数量将其命名为DD-Net 70。 在图2中DD-Net 70在网络前面扩展了一个预网络降维器。同时引入非方形卷积来压缩时间维度图像高度确保地震数据被约束到与速度模型相同的大小。降维器将使用多个卷积来协调以防止由一个卷积压缩引起的信息丢失。这种设置类似于InversionNet但本文将其推广到U-Net结构。 图2. 用于反演的DD-Net 70的深度网络架构。其结构与DD-Net类似如图1所示。不同之处在于左侧的预网络降维器。此外非方卷积用于辅助图下方的降维器。然后网络的输入和输出大小分别变为1000 × 70和70 × 70。
2.2 损失函数 为处理不同的解码器的不同任务本文提出了一个新的联合损失函数的网络架构。该损失函数由均方误差MSE和交叉熵损失函数组成。第一解码器直接输出单通道图像。它使用地面真实情况与预测速度模型执行一对一像素差异损失计算。第二解码器输出双通道图像。这两个通道相互作用以模拟速度模型的轮廓信息。事实上相关研究已经证明了交叉熵损失服务于速度重建中的二进制分类子任务的可行性。 首先MSE损失函数是用于描述颜色相似性的常见损失函数即 1 其中表示输出速度模型的像素数。和分别表示地震数据及其相应的地面真实速度模型。表示每次迭代中同时要训练的数据数量即批量大小。表示地震数据到预测速度模型的网络确定的映射。此外表示第k-th个解码器输出中的预测速度模型的第j-th个声道。因此是由地震数据预测的速度模型与实际速度模型之间的残差。 第二交叉熵损失函数提供了与差异损失相反的轮廓拟合思想即: 2 其中是通过对第二解码器的两个通道执行softmax而获得的即 3 在等式中(2)是速度模型的轮廓结构。图3a和图3b分别示出了和的结构。是的反转颜色一致地将和表示为二元掩码算子。同时1-si和si被表示为预测灰度图像使用从中提取注意信息。在条件概率方面在等式(2)中方程中的p·作为 4 轮廓越明显越大。为了确保此时的损失较小交叉熵损失引入了负熵。因此公式(4)经常被替换为 5 图三. 速度模型及其等值线的示例。(a)是模拟的速度模型以及b是通过Canny获得的该速度模型的轮廓结构。Canny的双阈值分别设置为10和15。 对于具有大的边缘偏差的样本交叉熵损失更多地受到惩罚。这确保了拟合损失可以集中在轮廓上而不是全局计算残差。同时轮廓在图像中的像素比例很小。这可能导致轮廓图像中像素的不平衡分布。与均方误差相比交叉熵损失更好地考虑了不同类的差异更公平地考虑了轮廓和背景信息。这种类似的轮廓损失函数的设计已经在图像分割领域中实践。 最后通过超参数α1和α2将这两个损失函数结合即 6 这两个参数的比例可根据不同的情况进行调整。为了预测准确的速度模型一些网络可以使用非归一化速度模型进行训练和预测。此时两个解码器损耗的数量级差异可能非常大。如SEG盐模型未归一化时设置为但对于归一化的OpenFWI模型该值常设置为10或。
2.3 课程学习 1)FWI的课程学习在传统的机器学习中呈现给网络的数据集的难度属性往往是随机的。因此它的复杂性和网络的当前学习状态被忽略。然而课程学习以阶段性适应的理念改变了这一不足并在许多领域取得了可观的成果。它试图逐渐增加训练数据集的难度以确保有效的拟合。具体来说一开始从一个相对简单的数据集开始训练网络。这有助于网络快速收敛并防止局部最优解被卡住。然后随着网络达到一定的性能水平逐渐引入更复杂的数据集。 如果仅使用单炮点则网络获得的地下信息是波覆盖的局部区域。因此本文利用多个炮点反馈的地震波反射记录来联合预测整个地下区域。然而在一些深度学习策略中单炮数据也可以用来实现一定的预测效果。这意味着网络可以通过学习构建从局部波形和频率到整个速度模型的记忆映射。虽然从物理角度来看这种映射并不合适但它可以用作网络学习的试点。它引导网络从时域波形到速度模型留下基本的风格印象。这一过程符合课程学习的理念。 2)地震数据的预定义课程学习网络中课程学习技术的使用必须指定两个组件的详细信息[30]。
难度测量器难度测量器告诉我们哪些数据是困难的可以决定不同数据的优先级。训练调度器训练调度器告诉我们何时以及需要训练什么难度的数据还告诉网络所选数据的训练参数包括epoch数和学习率。 目前根据测量器和调度器是定制的还是数据驱动的课程学习可以细分为预定义课程学习和自动课程学习。由于缺乏描述地震数据难度的先验知识本文使用预定义的课程学习。在具体的课程设置上采取了三个阶段。 图4. 基于FWI的预定义课程过程。中间的橙色区域演示了如何将地震数据处理为三阶段数据。橘色框中不同颜色箭头代表不同操作。蓝色和黄色箭头分别表示添加噪声和放大幅度。q表示模拟检测时的震源数相当于网络输入通道数。右侧显示了如何将三级数据排列到网络中。由橘色和绿色箭头形成的圆圈表示训练过程中阶段的迭代迭代将执行三次。一次迭代为训练提供多个批次。 (a)具有失真信息的单次激发数据地震观测记录由个共炮点道集组成从中获得了第个记录。首先对该记录进行噪声放大和振幅放大得到两个畸变记录。第二复制每个失真记录的个副本和原始记录的个副本。最后将这三者连接起来以获得个观察记录的组合。 (b)单炮数据取地震观测记录中的第条记录。然后得到这个记录的个副本。这些副本作为一个整体通过连接用作该阶段的数据。 (c)多炮数据直接使用炮点的地震观测记录作为本阶段的数据。由于网络的输入端口是确定的所以每一级的课程数据总是携带个通道。 将单炮数据放置在多炮数据之前有两个考虑因素
一方面单炮数据在多个副本之后被馈送到网络中。输入层中彼此不同的通道越少网络捕获输入之间差异所需的训练样本就越少。因此与多炮数据相比单炮数据具有更快的拟合能力。另一方面虽然单炮数据检测的地层区域有限但它可以作为多炮数据训练的风格指南。首先通过不完全信息和短期训练从波形到速度模型建立一个初始的认知网络。此外在单次激发数据之前设置失真信息的动机类似于数据增强。网络的鲁棒性通过预训练原始数据的混合噪声版本来确保。 自定义训练调度器为不同阶段设置不同的训练时期首先调度程序将数据按顺序集馈送到网络。同时输入网络的数据将被独立训练。其次当训练时期的数量达到预定义的上界时执行新一轮的调度。不同数据集内的数据分布存在显著差异。因此网络对三级数据也存在明显的适应性差距。出于这个原因不同的调度信息如下 表2 DD-Net和DD-Net 70的训练配置。第五列指示子部分III-C中的三个任务的训练时期比例。 三、创意收集
3.1 CRF 【在一些方法中CRF被添加在解码器的末尾以确保空间关联】CRFConditional Random Field条件随机场是一种用于序列标注和分割的统计模型常用于自然语言处理NLP和图像处理等领域。CRF模型能够考虑标签之间的依赖关系并利用这些依赖关系来提高标注或分割的准确性。在CRF模型中定义了一个条件概率分布用于描述给定输入序列下输出标签序列的概率。CRF通过特征函数来捕捉输入序列与输出标签之间的依赖关系并利用这些特征函数来计算条件概率。 CRF模型可以用于各种任务如命名实体识别NER、词性标注POS tagging、分词word segmentation等。在这些任务中CRF能够有效地利用上下文信息并考虑标签之间的约束关系从而提高标注的准确性。 CRF模型通常使用最大似然估计来训练参数并采用动态规划算法如Viterbi算法来高效地进行推断和预测。在深度学习时代CRF也常常与神经网络模型如循环神经网络RNN、卷积神经网络CNN等结合使用形成端到端的训练框架进一步提升模型的性能。 需要注意的是CRF模型虽然功能强大但在某些复杂场景下其计算复杂度较高可能需要进行优化和调整。此外CRF模型也需要合适的特征工程来捕捉输入序列与输出标签之间的依赖关系这对于模型性能的提升至关重要。
3.2 Canny边缘检测 在DD-Net论文中第二个解码器用于辅助提取训练轮廓信息提到了一种算法Canny 边缘检测Canny的双阈值分别设置为10和15它是一种使用多级边缘检测算法检测边缘的方法其检测步骤如下 1灰度化与去噪将噪声过滤掉噪声会影响边缘检测的准确性通常需要对图像进行滤波以去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域以便得到更准确的边缘。在实际处理过程中通常采用高斯滤波去除图像中的噪声。在滤波过程中通过滤波器对像素点周围的像素计算加权平均值获取最终滤波结果。滤波器的大小也是可变的高斯核的大小对于边缘检测的效果具有很重要的作用。滤波器的核越大边缘信息对于噪声的敏感度就越低。不过核越大边缘检测的定位错误也会随之增加。通常来说一个 5×5 的核能够满足大多数的情况。 2计算梯度的幅度与方向梯度的方向与边缘的方向是垂直的 3非极大值抑制即适当地让边缘“变瘦”。获得了梯度的幅度和方向后遍历图像中的像素点去除所有非边缘的点。在具体实现时逐一遍历像素点判断当前像素点是否是周围像素点中具有相同梯度方向的最大值并根据判断结果决定是否抑制该点。通过以上描述可知该步骤是边缘细化的过程。针对每一个像素点
若该点是正/负梯度方向上的局部最大值则保留该点若不是则抑制该点归零 4确定边缘使用双阈值算法确定最终的边缘信息。完成上述步骤后图像内的强边缘已在当前获取的边缘图像内。但一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的也可能是由于噪声所产生的。对于噪声必须将其剔除。设置两个阈值高阈值 maxVal与低阈值 minVal。根据当前边缘像素的梯度值指的是梯度幅度与这两个阈值之间的关系判断边缘的属性。具体步骤为 ① 如果当前边缘像素的梯度值大于或等于 maxVal则将当前边缘像素标记为强边缘。 ② 如果当前边缘像素的梯度值介于 maxVal 与 minVal 之间则将当前边缘像素标记为虚 边缘需要保留。 ③ 如果当前边缘像素的梯度值小于或等于 minVal则抑制当前边缘像素。 在上述过程中得到了虚边缘需要对其做进一步处理。一般通过判断虚边缘与强边缘是否连接来确定虚边缘到底属于哪种情况。通常情况下如果一个虚边缘
与强边缘连接则将该边缘处理为边缘。与强边缘无连接则该边缘为弱边缘将其抑制。 Canny函数及其使用OpenCV提供了函数cv2.Canny()来实现Canny边缘检测如下所示
edges cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])其中
edges计算得到的边缘图像。image 8 位输入图像。threshold1表示处理过程中的第一个阈值。threshold2表示处理过程中的第二个阈值。apertureSize表示 Sobel 算子的孔径大小。L2gradient计算图像梯度幅度gradient magnitude的标识。其默认值为 False。如果为 True则使用更精确的 L2 范数进行计算即两个方向的导数的平方和再开方否则使用 L1 范数直接将两个方向导数的绝对值相加。 学习参考OpenCV——Canny边缘检测cv2.Canny()_opencv canny-CSDN博客。
3.3 CBAM注意力机制 CBAM Convolutional Block Attention Module 是一种轻量级注意力模块的提出于2018年它可以在空间维度和通道维度上进行Attention操作。如下图所示CBAM包含CAMChannel Attention Module和SAMSpartial Attention Module两个子模块分别进行通道和空间上的Attention。这样不只能够节约参数和计算力并且保证了其能够做为即插即用的模块集成到现有的网络架构中去。 # 通道注意力模块
# 首先对输入数据分别进行平均池化和最大池化操作然后分别对这两个结果进行卷积和ReLU激活最后将两个结果相加并通过Sigmoid激活函数得到最终的输出
class ChannelAttention(nn.Module):def __init__(self, in_planes, ratio16)::param in_planes: 输入特征图的通道数:param ratio:super(ChannelAttention, self).__init__()self.avg_pool nn.AdaptiveAvgPool2d(1) # 定义一个自适应平均池化层输出尺寸在1×1self.max_pool nn.AdaptiveMaxPool2d(1) # 定义自适应最大池化层输出尺寸在1×1# 定义一个2D卷积层输入通道数为in_planes输出通道数为in_planes // ratio输入通道数除以比率卷积核大小为1x1不使用偏置项self.fc1 nn.Conv2d(in_planes, in_planes // ratio, 1, biasFalse)self.relu1 nn.ReLU() # 激活函数# 定义一个2D卷积层self.fc2 nn.Conv2d(in_planes // ratio, in_planes, 1, biasFalse)self.sigmoid nn.Sigmoid() # 激活函数def forward(self, x):# 数据首先通过平均池化层然后通过卷积层和ReLU激活函数再经过另一个卷积层得到avg_outavg_out self.fc2(self.relu1(self.fc1(self.avg_pool(x))))# 数据首先通过最大池化层然后同样经过卷积层和ReLU激活函数再经过另一个卷积层得到max_outmax_out self.fc2(self.relu1(self.fc1(self.max_pool(x))))out avg_out max_out# 对输出应用Sigmoid激活函数并返回结果return self.sigmoid(out)# 空间注意力模块
# 该模块首先对输入的张量计算平均值和最大值然后将这两个值拼接起来输入到一个卷积层中最后通过 Sigmoid 激活函数得到每个位置的权重
class SpatialAttention(nn.Module):def __init__(self, kernel_size7)::param kernel_size: 参数用于指定卷积核的大小这里默认值为7super(SpatialAttention, self).__init__()assert kernel_size in (3, 7), kernel size must be 3 or 7# 根据 kernel_size 的值计算卷积的 padding 值。若 kernel_size 是7则 padding 为3若 kernel_size 是3则 padding 为1。padding 3 if kernel_size 7 else 1# self.conv1 是一个卷积层输入通道数为2由 x 的维度决定输出通道数为1卷积核大小为 kernel_sizepadding 为上面计算的 padding 值且不使用偏置项biasFalseself.conv1 nn.Conv2d(2, 1, kernel_size, paddingpadding, biasFalse) # 7,3 3,1self.sigmoid nn.Sigmoid() # Sigmoid 激活函数def forward(self, x):# 对输入 x 沿着维度1通常是通道维度取平均值得到 avg_outavg_out torch.mean(x, dim1, keepdimTrue)# 对输入 x 沿着维度1取最大值得到最大值 max_out 和对应的索引这里未使用索引max_out, _ torch.max(x, dim1, keepdimTrue)# 将 avg_out 和 max_out 沿着维度1拼接起来得到新的张量 xx torch.cat([avg_out, max_out], dim1)# 将拼接后的张量 x 输入到卷积层 self.conv1 中得到输出x self.conv1(x)# 使用 Sigmoid 激活函数对卷积层的输出进行激活得到最终的空间注意力权重return self.sigmoid(x)# 首先使用通道注意力机制增强特征图的通道表示然后使用空间注意力机制增强特征图的空间表示。
# 通过这种方式CBAM可以自适应地关注输入特征图的特定通道和空间位置从而提供更有效的特征表示。
class CBAM(nn.Module):# in_planes:输入特征图通道数def __init__(self, in_planes, ratio16, kernel_size7)::param in_planes: 输入特征图的通道数:param ratio: 控制注意力机制强度的参数默认值为16:param kernel_size: 空间注意力模块中卷积核的大小默认值为7super(CBAM, self).__init__()# 通道注意力模块它接收输入特征图计算每个通道的重要性得分并将这些得分应用于输入特征图从而得到经过通道注意力增强的特征图。self.ca ChannelAttention(in_planes, ratio)# 空间注意力模块它接收经过通道注意力增强的特征图计算每个位置的重要性得分并将这些得分应用于特征图从而得到经过空间注意力增强的特征图。self.sa SpatialAttention(kernel_size)def forward(self, x):# 输入特征图 x 通过通道注意力模块 self.ca得到经过通道注意力增强的特征图# 将经过通道注意力增强的特征图与原始特征图相乘得到新的特征图out x * self.ca(x)# 新的特征图通过空间注意力模块 self.sa得到最终经过空间注意力增强的特征图# 注意这里的“相乘”实际上是逐元素相乘即Hadamard积element-wise multiplication目的是保留原始特征图的激活信息同时增加新的注意力权重信息result out * self.sa(out)return result
3.4 网络模块的设计
串联串联模块的制作比较简单只需要将多个模块串联加起来在通过一些横向连接即可。并联/变形变形模块可以通过卷积、transformer、通道注意力、空间注意力等便捷技术实现也可以通过contact进行通道合并还可以通过通道划分系数具体每个模块的权重与系数是如何划分的可完成一些消融实验。交互交互模块则可以通过cnn、transformer、fusion等设计实现。
四、小结
毕业设计任务书评价指标很多在之后如何进行选择在某些尝试中并不是所有的指标都表现得好根据结果进行合适的选择吗根据近两周的学习与尝试对网络架构的修改有了更深的理解也更加明白许老师之前说的加入一些组件的时候效果不一定好对参数的调整是一些漫长的过程。