周报(8.12-8.18)

news2024/9/24 11:33:33

周报(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 outputs


class 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 outputs


class 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 outputs

class 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_shape

    def 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 section
        self.down1 = unetDown(32, 64)
        self.down2 = unetDown(64, 128)
        self.down3 = unetDown(128, 256)
        self.down4 = unetDown(256, 512)

        # Decode1
        self.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)
        
        # Decode2
        self.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 1
        outputs = 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 2
        outputs = self.up2_1(center, outputs_jump2)
        outputs = self.up2_2(outputs, outputs_jump1)
        # delete no use
        del center
        del outputs_jump2
        del outputs_jump1
        outputs = 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 = weights

    def __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. 开展对地震速度图像拼接得研究

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科普|企业防泄密措施有哪些?(8种方法详细说明)

企业在日常运营中面临着各种信息泄露的风险,这些风险可能来自内部员工的不当操作或外部黑客的恶意攻击。为了保护企业的核心竞争力和商业机密,采取有效的防泄密措施至关重要。以下是八种常见的企业防泄密措施及其详细说明: 1. 数据分类与加密…

React多功能管理平台项目开发全教程

​🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-综合应用开发教程:构建多功能管理平台 目录 1.创建项目 2.改造目录结构 3.安装一些必须的模块 3.1 配置预处理器 3.1.1 配置别名@ 3…

第八节:Nodify 编辑器属性

引言 经过前几章的学习,你已经对Nodify框架有了初步的编程思路。当然只局限于这些还完全不够,本章节将阐述各个结构组件的一些常用属性,以便在日后的开发过程中更得心应手。 1、编辑器 平移 简介属性默认值平移功能 控制DisablePanningfals…

了解Swagger规范检查点

目录 检查 Api注解 第一项:是否包含接口的文字描述、接口的类名 检查 ApiOperation注解 第一项:是否包含HTTP请求方法(Get、Post等) 第二项:是否有对方法的简单描述 第三项:是否有对方法的详细描述 检查 ApiResponses注解 …

分享一个基于Python的抖音女装数据分析系统flask毕设女装数据采集系统(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

[数据集][目标检测]电力场景输电线均压环歪斜检测数据集VOC+YOLO格式303张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):303 标注数量(xml文件个数):303 标注数量(txt文件个数):303 标注类别…

Apache SeaTunnel技术架构演进及其在AI领域的应用

随着数据集成需求的增长,Apache SeaTunnel作为新一代的数据同步引擎,不仅在技术架构上不断演进,也在AI领域展现出其独特的应用价值。在CommunityOverCode Asia 2024大会上,Apache SeaTunnel PMC Chair 高俊 深入探讨SeaTunnel的技…

C++核心编程02——引用

摘录于B站黑马程序员提供的笔记。 1. 引用的基本使用 作用&#xff1a; 给变量起别名 语法&#xff1a; 数据类型 &别名 原名 实例&#xff1a; #include <iostream> using namespace std;int main() {// 引用基本语法// 数据类型 &别名 原名int a 10;in…

开放式耳机怎么戴?五大市场热卖爆款推荐!

开放式耳机的佩戴方法通常比较直观&#xff0c;但具体步骤可能因不同品牌和型号的设计而异。以下是一般的佩戴步骤&#xff1a; 1. 调整耳机&#xff1a;大多数开放式耳机都有可调节的耳挂&#xff0c;首先调整耳挂&#xff0c;确保它能够舒适地适应你的耳朵形状。 2. 定位耳…

FGF20:多些研究关注

成纤维细胞生长因子20&#xff08;FGF20&#xff09;是FGF9亚家族成员&#xff0c;作为调节中枢神经发育和功能的神经营养因子。 &#xff08;数据来源AlphaFold&#xff09; FGF20由208个氨基酸组成&#xff0c;属于分泌型胞外蛋白&#xff0c;无信号肽区段&#xff0c;功能域…

独辟蹊径:找工作时的创新思维——之找到一份工作

一、背景 在日常生活中我们会遇到一些开发者抱怨“资深开发者牢牢占据着岗位&#xff0c;让年轻开发者鲜有工作机会”。与此同时&#xff0c;也有一些开发者抱怨说&#xff1a;没有人愿意招聘上了点年纪的开发者&#xff0c;每个人都在歧视大龄开发者。还有一些人抱怨他们的技…

【网络安全】服务基础阶段——第一节:Windows系统管理基础----进制转换与IP地址

一、进制转换与IP地址 进制与计算&#xff1a; 进制转换是指将一个数字从一个数制&#xff08;基数&#xff09;转换为另一个数制的过程 二进制&#xff08;Binary&#xff09;&#xff1a;基于0和1的数制&#xff0c;例如1011&#xff08;十进制11&#xff09;。八进制&…

网站分类目录提交技巧有哪些

在提交网站到分类目录时&#xff0c;掌握一定的技巧可以显著提升通过率和效果。以下是一些关键的提交技巧&#xff1a; 选择高质量的分类目录&#xff1a; 确保选择的分类目录有足够的流量和权重&#xff0c;这样提交的内容才能得到有效的展示。 考察分类目录的正规性和可信度&…

纷享AI | AI PaaS平台,企业智能转型的加速器

随着人工智能技术的飞速发展&#xff0c;企业对于智能化转型的需求愈发迫切。那么&#xff0c;企业如何把握先机&#xff0c;在激烈的市场竞争中保持领先&#xff1f;答案可能就藏在AI PaaS平台的无限潜力中。纷享销客AI PaaS平台通过Agent Builder和Model Builder为上层的场景…

山体滑坡预警摄像机

山体滑坡是一种常见的地质灾害&#xff0c;给人们的生命和财产安全带来了巨大威胁。为了及时监测山体滑坡的情况并提前预警&#xff0c;可以使用山体滑坡预警摄像机 。山体滑坡预警摄像机是一种结合了摄像技术和智能算法的设备&#xff0c;能够实时监测山体滑坡的变化情况&…

昂科烧录器支持Melexis迈来芯的位置传感器MLX90365KDC

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Melexis迈来芯的位置传感器MLX90365KDC已经被昂科的通用烧录平台AP8000所支持。 MLX90365KDC是第II代Triaxis位置传感器IC。 这款单片器件可凭借其表面的集磁点(IMC)&#xf…

民大校园学习资料转让网站设计与实现---附源码97053

摘要 在当今数字化时代&#xff0c;学习资料转让网站作为在线学习和教育资源的重要平台&#xff0c;发挥着越来越重要的作用。为了满足用户对学习资料的需求&#xff0c;本论文旨在构建一个可靠高效的学习资料转让网站系统。 NodeJS是一个基于JavaScript的服务器端运行环境&…

【R语言实战】——多模型预测及评价

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

langchain入门系列之六 使用langchain构建PDF解析助手

本文将介绍如何使用langchain构建一个pdf解析助手&#xff0c;在此文中你将学习到langchain如何与web应用(fastapi)相结合&#xff0c;向量持久化等知识&#xff0c;话不多说&#xff0c;现在开始。 安装环境 pip install fastapi pip install python-dotenv pip install uv…

文件和注册表关联

注册表是Windows操作系统的信息存储中心&#xff0c;存放着包括计算机硬件配置、已安装软件的设置信息、当前用户的环境设置及某些文件类型与对其进行访问和操作的应用程序之间的联系等重要信息。Windows操作系统早期版本中存放在初始化文件(.ini)中的许多信息现在都存放在注册…