周报(8.12-8.18)

2024-08-27 06:52
文章标签 周报 8.18 8.12

本文主要是介绍周报(8.12-8.18),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

周报(8.12-8.18)

本周工作

DD-Net学习与代码复现

在这里插入图片描述

DD-Net网络结构如上图所示。DD-Net也有一个为处理OpenFWI数据的版本:DD-Net70:

在这里插入图片描述

与传统DL-FWI不同的是,DD-Net同时拥有两个解码器,第一个解码器的目标是传统的速度模型,它侧重于速度值的精确拟合,这也是用于生成速度图像的主要解码器;第二个解码器的目标是速度模型边缘信息,将Canny轮廓提取后的黑白边缘速度模型进一步用作第二解码器的拟合目标。此解码器将用作训练轮廓信息的辅助解码器。

网络结构复现

与盐数据不同的是,OpenFWI在时间域上的跨度非常大,时间域和空间域的比例值较大,直接进行特征提取工作会导致空间上的时间丢失。因此,在开始特征提取工作之前,我们需要先对时间域进行压缩。第一步压缩使用插值完成,使用了以下函数:

torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False)

该函数可以使用不同的插值算法碓输入进行插值,输入参数解释如下:

  • input: 输入
  • size: 输出数据的形状
  • scale_factor: 表示在输入的不同维度上进行缩放的比例
  • mode: 使用的差值算法,可以使用’nearest’最邻近、'linear’线性、'bilinear’双线性、‘bicubic’、‘trilinear’、‘area’和’nearest-exact’。
  • align_corners:将像素视为正方形而不是点。对于将像素视为点的情况,计算某像素值时使用临近点的像素值进行;对于将像素视为正方形的情况,计算某像素值时会将该点与周围三点合并为像素块,并使用临近像素块的值进行计算。
  • recompute_scale_factor: 如果设置为True,函数将强制使用scale_factor作为输出大小的依据。
  • antialias: 抗锯齿。

其他操作是经典的卷积操作,不再解释。结合起来,可以获得下采样部分的代码:

class DownSampling(nn.Module):def __init__(self, shot_num):super().__init__()self.conv1_1 = ConvBlock(shot_num, 8, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))self.conv1_2 = ConvBlock(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))self.conv2_1 = ConvBlock(8, 16, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))self.conv2_2 = ConvBlock(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))self.conv3_1 = ConvBlock(16, 32, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))self.conv3_2 = ConvBlock(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))def forward(self, inputs):width = inputs.shape[3]new_size = [width * 8, width]outputs = F.interpolate(inputs, size=new_size, mode='bilinear', align_corners=False)outputs = self.conv1_1(outputs)outputs = self.conv1_2(outputs)outputs = self.conv2_1(outputs)outputs = self.conv2_2(outputs)outputs = self.conv3_1(outputs)outputs = self.conv3_2(outputs)return outputs

随后DD-Net70使用了与FCNVMB相似的网络结构:

class unetConv2(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.conv1 = nn.Sequential(nn.Conv2d(in_channels, out_channels, 3, 1, 1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True))self.conv2 = nn.Sequential(nn.Conv2d(out_channels, out_channels, 3, 1, 1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True))def forward(self, inputs):outputs = self.conv1(inputs)outputs = self.conv2(outputs)return outputsclass unetDown(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.conv = unetConv2(in_channels, out_channels)self.down = nn.MaxPool2d(2, 2, ceil_mode=True)def forward(self, inputs):outputs = self.conv(inputs)outputs = self.down(outputs)return outputsclass unetJumpUp(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)self.conv = unetConv2(out_channels*2, out_channels)def forward(self, input1, input2):# inputs1是上一层输入数据,inputs2是跳跃连接数据outputs = self.up(input1)outputs = F.interpolate(outputs, size=(input2.shape[2],input2.shape[3]), mode='bilinear')outputs = self.conv(torch.cat([outputs, input2], 1))return outputsclass unetUp(nn.Module):def __init__(self, in_channels, out_channels, output_shape):super().__init__()self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)self.conv = unetConv2(out_channels, out_channels)self.output_shape = output_shapedef forward(self, input1):outputs = self.up(input1)outputs = F.interpolate(outputs, size=self.output_shape, mode='bilinear')outputs = self.conv(outputs)return outputs

与FCNVMB不同的是,DD-Net中使用了interpolate函数进行函数裁剪,而不是使用pad函数。

网络代码复现

对于网络的代码实现,我抱有部分疑虑,以下是我参考论文复现出的代码:

class DDNet70(nn.Module):def __init__(self):super().__init__()self.downSampling = DownSampling()# Intrinsic UNet sectionself.down1 = unetDown(32, 64)self.down2 = unetDown(64, 128)self.down3 = unetDown(128, 256)self.down4 = unetDown(256, 512)# Decode1self.up1_1 = unetJumpUp(512, 256)self.up1_2 = unetJumpUp(256, 128)self.up1_3 = unetUp(128, 64, (35, 35))self.up1_4 = unetUp(64, 32, (70, 70))self.conv1 = ConvBlock_Tanh(32, 1)# Decode2self.up2_1 = unetJumpUp(512, 256)self.up2_2 = unetJumpUp(256, 128)self.up2_3 = unetUp(128, 64, (35, 35))self.up2_4 = unetUp(64, 32, (70, 70))self.conv2 = ConvBlock_Tanh(32, 2)def forward(self, inputs,):outputs = self.downSampling(inputs)outputs = self.down1(outputs)outputs_jump1 = self.down2(outputs)outputs_jump2 = self.down3(outputs_jump1)center = self.down4(outputs_jump2)# Decoder 1outputs = self.up1_1(center, outputs_jump2)outputs = self.up1_2(outputs, outputs_jump1)outputs = self.up1_3(outputs)print(outputs.shape)outputs = self.up1_4(outputs)outputs1 = self.conv1(outputs)# Decoder 2outputs = self.up2_1(center, outputs_jump2)outputs = self.up2_2(outputs, outputs_jump1)# delete no usedel centerdel outputs_jump2del outputs_jump1outputs = self.up2_3(outputs)outputs = self.up2_4(outputs)outputs2 = self.conv2(outputs)return [outputs1, outputs2]

但论文代码中没有完全区分两个解码器的卷积函数,即进行速度图像解码的卷积与进行边缘图像的卷积是同一个卷积对象, 理论上具有相同的参数。虽然有较大的相似性,但这确实是两个不同的任务,虽然有较大的相似性,使用同一组卷积对象是否有所不妥?

损失函数

DD-Net的另一个创新点在于,DD-Net使用了复合损失函数,因为边界图像是黑白图像,直接使用MSE并不完全合理。但如果把边缘图像视作“该像素是否是边缘”的标签,就可以使用交叉熵损失进行损失计算。DD-Net的输出同时含有速度图像与边缘图像,因此就必须构建一个复合的损失函数,简单来说,DD-Net构建了一个这样的损失函数。
L o s s = α 1 ⋅ M S E + α 2 ⋅ C r o s s E n t r o p y Loss = \alpha_1\cdot MSE+\alpha_2\cdot CrossEntropy Loss=α1MSE+α2CrossEntropy
根据论文介绍,对于归一化后的OpenFWI数据, α 2 α 1 \frac{\alpha_2}{\alpha_1} α1α2最好在 [ 10 , 1 0 2 ] [10, 10^2] [10,102]内。复现代码如下:

class LossDDNet:def __init__(self, weights=[1, 1], crossEntropy_weight=[1, 1]):self.criterion1 = nn.MSELoss()crossEntropyWeight = torch.from_numpy(np.array(crossEntropy_weight, dtype=np.float32)).cuda()self.criterion2 = nn.CrossEntropyLoss(weight=crossEntropyWeight)self.weights = weightsdef __call__(self, outputs1, outputs2, targets1, targets2):mse = self.criterion1(outputs1, targets1)cross = self.criterion2(outputs2, torch.squeeze(targets2).long())criterion = (self.weights[0] * mse + self.weights[1] * cross)return criterion

其中,torch.squeeze函数会移除对象中所有长度为1的维度。

分阶段学习

为了使训练效果更好,DD-Net在训练过程中对数据集难度进行分级,总共分为3级,从简单的数据开始训练,完成阶段后训练更难得数据集。

学习地震正演

根据相关书籍,继续学习地震正演理论,持续记录学习笔记。

下周工作

  1. 训练DD-Net70网络,观察网络效果
  2. 继续学习地震正演
  3. 开展对地震速度图像拼接得研究

这篇关于周报(8.12-8.18)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110946

相关文章

AI周报(9.1-9.7)

AI应用-Tidal 引领海洋养殖革命 Tidal团队,一个源自Alphabet X的创新项目,今年七月顺利从X实验室毕业,成为一家独立的公司。Tidal正在通过人工智能技术改变海洋养殖,特别是鲑鱼养殖。Tidal的总部位于挪威特隆赫姆,他们结合了传感器、机器人、数据科学和人工智能技术,为鲑鱼养殖提供全面的解决方案。这个系统可以监控鱼类并提供产量估算,旨在在问题(如海虱)造成严重损害之前发现它们

王知无的技术周报(3.25-3.29日)

发件人:王知无 收件人:我的朋友们 本周知识点 01 我是如何失去一位女粉丝的 一位女粉丝管我要一张真人照片,问题来了,她要张真人照片做什么用? 02 ApacheFlink深度解析-JOIN-LATERAL 本篇重点向大家介绍了一种新的JOIN类型 - JOIN LATERAL。并向大家介绍了SQL Server中对LATERAL的支持方式,详细分析了JOIN LATERAL和I

周报 | 24.8.26-24.9.1文章汇总

为了更好地整理文章和发表接下来的文章,以后每周都汇总一份周报。 周报 | 24.8.19-24.8.25文章汇总-CSDN博客 python | 提升代码迭代速度的Python重载方法-CSDN博客 机器学习算法与Python学习 | 黑匣子被打开了?能玩的Transformer可视化解释工具!_研究别人的黑盒算法 机器学习 python-CSDN博客 极市平台 | 语言图像模型大一统!M

学习周报-2024.8.31

目录 摘要 Abstract 创新点总结 模型数学原理 实验设置 一、验证实验 二、对比实验 摘要 这周重新梳理出论文的三个创新点,对所提出方法进行数学原理验证,证明其可行性。重新设置了实验部分,分为验证实验和对比实验,一共四个实验,选用基线对比模型有LSTM、GRU、MLP、ITransformer。这周对数据做了选择和处理,后续需要继续调整数据和模型,以达到实验结果要

机器学习周报(8.26-9.1)

文章目录 摘要Abstractself-attetionQKV理解如何让self-attention更有效local attention/truncated attention方法stride attention方法Global Attention方法data driving方法Clusteringsinkhorn sorting network选取representative keys减少

周报_2024/9/1

周报 时间 2024/8/26——2024/9/1 科研进展 1.为模型融入TTT层重复实验 2.设计新实验架构,融合主机级、流级统计特征和包级原始数据 下周计划 实现新实验架构

机器学习课程学习周报十

机器学习课程学习周报十 文章目录 机器学习课程学习周报十摘要Abstract一、机器学习部分1.1 生成对抗网络1.2 生成器与辨别器的训练过程1.3 信息论1.3.1 信息量1.3.2 熵1.3.3 交叉熵1.3.4 相对熵/KL散度1.3.5 交叉熵损失函数1.3.6 JS散度 1.4 GAN的理论介绍 总结 摘要 本周学习了生成对抗网络(GAN)的基本原理和训练过程。重

EXCEL VBA根据数据生成word文档周报并加背景格式突出显示

EXCEL VBA根据数据生成word文档周报并加背景格式突出显示 Public wwSub 生成word()Dim ww As WorksheetDim wj As WorksheetDim wz As WorksheetDim wb As WorkbookDim wbf As Workbookfpath = ThisWorkbook.Path & "\"fname = Dir(fpath)h

2024年8月20日~2024年8月26日周报

目录 一、前言 二、完成情况 2.1 解决网络波动问题——学习率 2.2 设计盐数据速度模型展示图 三、下周计划 一、前言         上周主要完成: ①与老师讨论损失函数与介绍部分内容;②基于盐数据设计TU-Net的网络架构,并思考如何引出该网络架构;③验证TU-Net在SEG模拟盐数据上的适用情况;         本周主要完成: ①解决验证集上损失函数的波动问题;

机器学习周报(8.19-8.25

文章目录 摘要Abstract1.PyTorch环境的配置及安装使用PyCharm配置环境安装配置jupyter 2.两个Python常用函数3.DataSet4.TensorBoard的使用绘制一幅坐标图使用tendorboard对一幅图片进行操作 5.torchvison中的transforms总结 摘要 在之前学习了一些机器学习相关理论之后,本周进行了一些简单的代码实操学