网络架构学习之FCNVMB(基于U-Net架构)

目录

一、U-Net介绍

1.1 网络简单介绍

 1.2 网络特点

二、FCNVMB介绍

2.1 文章简介

2.2 网络简单介绍

2.3 代码介绍

2.4 跳跃连接

2.5 训练过程

2.6 FCNVMB与InversionNet的比较


一、U-Net介绍

1.1 网络简单介绍

        U-Net是基于全卷积网络下一个语义分割应用于生物医学的深度学习网络,主要应用与医学领域的图像分割,因其网络整体结构呈现U字型,因此被称为U-Net网络。该方法在2015年MICCAI会议上提出。

        UNet是基于编码器-解码器的网络,从左边到中间,图像尺寸一步步减小,通道数一步步增加,右边是一个逆过程。

       语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支。与分类任务不同,语义分割需要判断图像每个像素点的类别,进行精确分割。语义分割目前在自动驾驶、自动抠图、医疗影像等领域有着比较广泛的应用。

        U-Net采用全卷积神经网络——左侧为下采样,右侧为上采样。

        encoder:左边为特征提取网络(使用conv和pooling)。

        decoder:右边为特征融合网络(使用上采样产生的特征图与左侧特征图进行concatenate操作) 。

        pooling层会丢失图像信息和降低图像分辨率且是永久性的,对于图像分割任务有一些影响,对图像分类任务的影响不大。为什么要做上采样呢?上采样可以让包含高级抽象特征低分辨率图片在保留高级抽象特征的同时变为高分辨率,然后再与左边低级表层特征高分辨率图片进行concatenate操作。

 1.2 网络特点

        (1)跳跃连接(Skip Connection):中间四条灰色的平行线,在上采样的过程中,融合下采样过过程中的feature map,遇到大小不相同时使用的是裁剪操作而非padding操作。在解码器阶段会采用原编码器的一些网络的特征map来融合进行学习,产生关联。

        (2)图像分割:可以对每个像素点进行分割,获得更高的分割准确率。

        (3)拼接而非相加(Concat):利用之前编码器的结构的时候,实际是将两个通道直接连在一起进行扩充(128+128=256)。

        (4)架构上,更充分地融合浅层特征(编码器结构)和深层特征(解码器结构):浅层特征图更倾向于表达例如点、线、边缘轮廓等基本特征单元,蕴含的空间信息更多,图像涵盖面积更广;深层特征图更倾向于表达图像的语义信息,蕴含的空间信息更少,感受不到与原来图片的关联,语义特征更多,涵盖的计算机所理解的信息更多。

        (5)支持少量的训练模型:在医学方向所能够训练的数据相对较小、且同时需要进行检测的数据/目标较大,所以在U-Net网络中使用到了数据增强的处理,分割的准确度也不会差。

二、FCNVMB介绍

2.1 文章简介

        论文名称:Deep-Learning inversion: a next gneration seismic velocity-model building method(Fangshu Yang and Jianwei Ma)——2019年

        面向数据集:SEG盐数据及其模拟(严格的端到端网络结构,比inversionNet复杂一些,是U-Net的网络结构)

        该算法属于FCN引导的VMB(Velocity Model Build)-速度模型构建的缩写,在代码层这个算法更类似于UNet架构,UNet隶属于FCN的一种改进后的变体

        FCN-全连接的卷积神经网络,针对图像分割的一些任务,通过特征图对应像素值的相加来融合特征的。

        U-Net-处理图像分割的任务,但是比传统FCN更高级一些,处理的任务更好一点,主要应用于医学领域。通过通道数的拼接,形成更厚的特征,会更加消耗显存。

2.2 网络简单介绍

图例介绍: 

        (1)FCNVMB由基本的编码器(左侧)解码器(右侧)共同构成,分别采用蓝色橙色表示。

        (2)红色箭头:一个红色箭头代表三个操作——conv(卷积)、BN(归量化)、ReLU(激活函数),图片的数量和通道数都没有发生变化,相当于特征的重整合,为接下来的尺寸变化做准备。

        (3)紫色箭头(下采样-最大池化):会导致尺寸缩小一半, 相当于特征进一步提取细化。

        (4)黄色箭头(反卷积):导致尺寸扩大一倍,主要用于解码器。

        (5)蓝色箭头:表示1*1的卷积,保证图片尺寸不变,进行特征映射。

        (6)蓝色数字(立方体的宽度),代表通道数(通道数的变化与卷积个数有关, 这个可以通过程序灵活定义, 但是可以发现通道的减少是服从一定规律的),立方体侧面截面的面积代表一张图片的尺寸大小(当前网络层的Feature map),立方体中的黑色字体就代表这个Feature map截面的尺寸。

        (7)每个通道数存在的时间基本上只有三次,每次通道数的变化总是在两次红色卷积+一次紫色卷积之后。

        (8)跳跃连接(skip connection):编码器的结构会通过skip connection与解码器的部分通道进行补充,该过程通过虚线表示,skip connection直接进行通道的合并而非相加。

2.3 代码介绍

        在代码中,会将一些简单卷积相关操作整合,自底向上来看,分为三步:

        ①Pytorch库中独立的卷积操作(低级操作);

        ②卷积组合 (两次红色箭头) 封装为: unetConv2(…)(中级操作);

        ③表示编码和解码:被封装为unetDown(…)和unetUp(…)(高级操作),这些操作的组合顺序在图中用不同的色区分割。这两个高级操作是由两次中级操作和一次最大池化或反卷积构成。

        例如:紫色、黄色和蓝色的线可以称为低级操作,红色称为中级操作。

搭建网络的主要代码:

# 四次下采样的过程—对应灰色、紫色、绿色、黄色子块
self.down1 = unetDown(self.in_channels, filters[0], self.is_batchnorm)
self.down2 = unetDown(filters[0], filters[1], self.is_batchnorm)
self.down3 = unetDown(filters[1], filters[2], self.is_batchnorm)
self.down4 = unetDown(filters[2], filters[3], self.is_batchnorm)# unetConv2是指两次红色箭头的封装-中级操作
self.center = unetConv2(filters[3], filters[4], self.is_batchnorm)# 四次上采样的过程-对应黄色、绿色、紫色、灰色子块
self.up4 = unetUp(filters[4], filters[3], self.is_deconv)
self.up3 = unetUp(filters[3], filters[2], self.is_deconv)
self.up2 = unetUp(filters[2], filters[1], self.is_deconv)
self.up1 = unetUp(filters[1], filters[0], self.is_deconv)# 进行一次卷积操作完成输出
self.final = nn.Conv2d(filters[0], self.n_classes, 1)

2.4 跳跃连接

    过程:①获得上一次向上采样得到的特征图inputs2,通过一次上采样得到outputs2;②接收编码结构与之相对应的特征的输出图inputs1;③inputs1与outputs2尺寸大小不一致,通过F.pad补齐尺寸;④通过torch.cat进行合并,并通过一次卷积操作输出。

def forward(self, inputs1, inputs2):''':param inputs1:      Layer of the selected coding area via skip connection:param inputs2:      Current network layer based on network flows:return:'''# 反卷积操作outputs2 = self.up(inputs2)# 计算边缘差异大小,对inputs1进行扩充offset1 = (outputs2.size()[2] - inputs1.size()[2])offset2 = (outputs2.size()[3] - inputs1.size()[3])padding = [offset2 // 2, (offset2 + 1) // 2, offset1 // 2, (offset1 + 1) // 2]# Skip and concatenateoutputs1 = F.pad(inputs1, padding)return self.conv(torch.cat([outputs1, outputs2], 1))

        ①inputs1:来自于与当前向上采样相对称的一次下采样操作的输出结果

        ②inputs2:表示上一次unetUp(…)操作结束后的输出Feature map,同时也作为本次unetUp(…)的最近端输入。inputs2在进入程序后立马进行了一次反卷积扩大了一倍尺寸顺势变成了outputs2。

        ③从inputs2outputs2:尺寸扩大了一倍, 通道数缩小了一半outputs2尺寸为256*100*76。

        注意:需留意skip connection在代码中的实现过程, 明确当前Feature map与编码阶段的哪个层进行通道整合。

        inputs1与outputs2通道一致但尺寸并不匹配通过F.pad操作将inputs1进行了扩充得到了同尺寸的outputs1

        而后将outputs1outputs2进行通道合并合并为一个512*100*76Feature map。

        最后将这个Feature map作为一个整体再度进行两次红色箭头的操作。

2.5 训练过程

        网络参数介绍:

        FCNVMB采用了一种迁移学习的思想:先训练模拟数据,让网络大概认识到SEG盐数据的分布,通过模拟盐数据的背景完成针对真实数据的学习。

        ①基于速度模型,通过正演生成地震数据;

        ②调用代码完成初始模型训练得到初始的预训练模型(训练100轮),可针对模拟盐数据进行预测,达到一些效果;

        ③真实数据正演得到地震数据,再进行训练,可以只训练50轮,得到再训练模型(可针对真实数据进行预测,也可针对模拟数据进行预测,但是效果不太好);

2.6 FCNVMB与InversionNet的比较

          相同点:

        ①均单一的端到端深度网络,并没有利用更多的物理含义。

        ②均采用了编码器-解码器的架构。

        ③均利用叠前多炮数据的不同炮集直接投入训练,并未处理。

        不同点:

        ①InversionNet在编码的过程中最终将图像压缩为完全的一维向量抛弃了空间关联性FCNVMB在压缩后仍保留了25 * 19的空间尺寸关联。 但是对应的代价是FCNVMB的模型内存占有量很大难以进行大batch体量的训练而InversionNet可以非常灵活进行训练

        ②FCNVMB面向SEG盐数据, InversionNet面向部分OpenFWI的数据因为OpenFWI数据的特点InversionNet有非常明显的高度降维部分。

        ③FCNVMB使用了迁移学习的训练手段,后者InversionNet是单一的训练思想  

        ④FCNVMB采用了包含skip connectionUNet的架构InversionNet是单一的CNN架构

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

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

相关文章

面试算法54:所有大于或等于节点的值之和

题目 给定一棵二叉搜索树,请将它的每个节点的值替换成树中大于或等于该节点值的所有节点值之和。假设二叉搜索树中节点的值唯一。例如,输入如图8.10(a)所示的二叉搜索树,由于有两个节点的值大于或等于6(即…

小红书app拉新推广一手官签渠道 附地推网推项目攻略

小红书app拉新高价版本在”聚量推客“上架啦! 可以通过小红书申请后在”聚量推客“进行报备,审核通过后即可开始推广 简单易做,仅允许 地推 网推 校园 社群 私域量等推广方式推广,属于百搭项目

自动化测试和性能测试面试题精选

自动化测试相关 包含 Selenium、Appium 和接口测试。 1. 自动化代码中,用到了哪些设计模式? 单例模式工厂模式PO模式数据驱动模式 2. 什么是断言? 检查一个条件,如果它为真,就不做任何事,用例通过。如果…

uniapp写一个计算器用于记账(微信小程序,APP)

提要:自己用uniapp写了一个记账小程序(目前是小程序),写到计算器部分,在网上找了别人写的计算器,大多数逻辑都是最简单的,都不能满足一个记账计算器的基本逻辑。与其在网上找来找去,…

K8S运维 解决openjdk:8-jdk-alpine镜像时区和字体问题

目录 一、问题 二、解决 三、完整代码 一、问题 由于项目的Dockerfile中使用openjdk:8-jdk-alpine作为基础镜像来部署服务,此镜像存在一定问题,例如时差8小时问题,或是由于字体问题导致导出excel文件,图片处理内容为空等。 二…

【扩散模型】不同组件搭积木,获得新模型

学习地址: https://github.com/huggingface/diffusion-models-class/tree/main/unit3 VAE The Tokenizer and Text Encoder UNet In-Painting 例如:基于contrlnet做的校徽转图片

视频会议系统方案报价

视频会议系统 报价方案是咨询视频会议系统价格用户所关注的,但是报价是一个比较细致的工作,需要从多维度进行对比。 1. 视频会议终端设备费用:根据所需设备的数量和所选设备价格确定。视频会议终端类型各异,摄像头、麦克风、显示设…

QT5.15.2搭建Android编译环境及使用模拟器调试(全)

一、安装QT5.15.2 地址:下载 我电脑的windows的,所以选windows 由于官方安装过程非常非常慢,一定要跟着步骤来安装,不然慢到怀疑人生 1)打开"命令提示符"(开始 -> Windows 系统 -> 命令…

清华大学利用可解释机器学习,优化光阳极催化剂,助力光解水制氢

水的太阳能光电化学 (PEC) 分解是将太阳能高效转换为氢能的方法,是一种很有前景的可再生能源生产方式。然而,受电极性质及电极缺陷的影响,PEC 反应的效率较低,需要合适的助催化剂辅助。而电解池、光电极和助催化剂组成的 PEC 系统…

windows server 2016调优

1. 增加TCP连接的最大数量: 在您当前的注册表路径(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters)中的右侧窗格,右击空白处,选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…

【深度学习】【pytorch】对卷积层置零卷积核进行真实剪枝

最近需要对深度学习模型进行部署,因此需要对模型进行压缩,博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 前言卷积层剪枝总结 前言 深度学习剪枝(Pruning)是一种用于减少神经网络模型大小、减少计算量和提高推理效率的技术,通过去除神经…

thinkphp的路径参数(RESTFul风格),把参数写在路径里

thinkphp官方文档 https://www.kancloud.cn/manual/thinkphp5_1/353969 有一个Blog控制器,里面的read方法是固定的,不能该 route.php里添加如下代码,访问 blog对应的就是 android/blog Route::resource(blog,android/blog);然后访问路径

设计模式——模板方法模式(Template Pattern)+ Spring相关源码

文章目录 一、模板方法模式定义二、例子2.1 菜鸟教程例子2.1.1 抽象类Game 定义了play方法的执行步骤。2.1.2 继承Game类并实现initialize、startPlay、endPlay方法。2.1.3 使用 2.2 JDK源码 —— Map 2.3 Spring源码 —— JdbcTemplate2.4 Spring源码 —— RestTemplate三、其…

NLP之Bert实现文本分类

文章目录 1. 代码展示2. 整体流程介绍3. 代码解读4. 报错解决4.1 解决思路4.2 解决方法 5. Bert介绍5.1 什么是BertBERT简介:BERT的核心思想:BERT的预训练策略:BERT的应用:为什么BERT如此受欢迎?总结: 1. 代…

windows使用YOLOv8训练自己的模型(0基础保姆级教学)

目录 前言 一、使用labelimg制作数据集 1.1、下载labelimg 1.2、安装库并启动labelimg 1.4、制作YOLO数据集 二、使用YOLOv8训练模型 2.1、下载库——ultralytics (记得换源) 2.2、数据模板下载 2.3、开始训练 1、启动train.py,进行…

QT+SQLite数据库配置和使用

一、简介 1.1 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 二、下载和配置 2.1 SQLite下载…

GitLab(2)——Docker方式安装Gitlab

目录 一、前言 二、安装Gitlab 1. 搜索gitlab-ce镜像 2. 下载镜像 3. 查看镜像 4. 提前创建挂载数据卷 5. 运行镜像 三、配置Gitlab文件 1. 配置容器中的/etc/gitlab/gitlab.rb文件 2. 重启容器 3. 登录Gitalb ① 查看初始root用户的密码 ② 访问gitlab地址&#…

微信小程序-form表单-获取用户输入文本框的值

微信小程序-form表单-获取用户输入文本框的值 data: {userName: ,userPwd:""},//获取用户输入的用户名 userNameInput:function(e) {this.setData({userName: e.detail.value}) }, passWdInput:function(e) {this.setData({userPwd: e.detail.value}) }, //获取用户输…

Pycharm出现的一些问题和解决办法

1.每次启动打开多个项目,速度很慢。改为每次启动询问打开哪个单一项目 Setting -> Appearance & Behavior -> System Settings -> Project -> 关闭Reopen projects on startop 2.一直显示《正在关闭项目closing project》,关不上 pycha…

Java后端开发——JDBC组件

JDBC(Java Database Connectivity)是Java SE平台的一种标准API,它提供了一种标准的方法来访问关系型数据库,使得Java程序能够与各种不同的数据库进行交互,这篇文章我们来进行实验体验一下。 自定义JDBC连接工具类 1.编…