深度学习基础--卷积的变种

news2024/9/19 9:26:48

随着卷积同经网络在各种问题中的广泛应用,卷积层也逐渐衍生出了许多变种,比较有代表性的有:
分组卷积( Group Convolution )、转置卷积 (Transposed Convolution) 、空洞卷积( Dilated/Atrous Convolution )、可变形卷积( Deformable Convolution ),下面分别介绍下。

1. 分组卷积

在普通的卷积操作中,一个卷积核对应输出特征图的一个通道,而每个卷积核又会作用在输入特征图的素有通道上(即卷积核的通道数等于输入特征图的通道数),因此最终输出的特征图的每个通道都与输入特征图的所有通道相连接。也就是说,在通道这个维度上,是“全连接的”。
在这里插入图片描述
所谓分组卷积,其实就是将输入通道和输出通道都划分为同样的组数,然后仅仅让处于相同组号的输入通道和输出通道进行“全连接”,如图:
在这里插入图片描述

如果记g 为输入/输出通道所分的组数,则分组卷积能够将卷积操作的参数量和计算量都降低为普通卷积的1/g。分组卷积最初是在 A lexNe t 网络中引入的。当时,为了解决单个 G P U 无法处理合高较大计算量和存储需求的卷积层这个问题,就
采用分组卷积将计算和存储分配到多个 GPU 上。 后来随着计算硬件的不断升级,这个方向上的需求已经大为减少。目前,分组卷积更多的被用来构建移动设备的小型网络模型,例如深度可分离在积(),就极为依赖分组卷积。不过,分组卷积也存在一个潜在的问题:虽然在理论上它可以显著降低计算量,但是对内存的访问频繁程度并未降低,且现有的GPU加速库(如 cuDNN) 对其优化的程度有限,因此官在效率上的提升并不如理论上显著。

2. 转置卷积

普通卷积操作可以形式化为一个矩阵乘法运算,即:
y = A x (1.1) y=Ax \tag{1.1} y=Ax(1.1)
其中, x x x, y y y, 分别是卷积的输入和输出,维度分别是 d ( i ) d^{(i)} d(i) d ( o ) d^{(o)} d(o),A是由卷积核、滑动步长决定的常对角矩阵,维度为 d ( i ) × d ( o ) d^{(i)}×d^{(o)} d(i)×d(o),其每一行对应着卷积核的一次滑动位置。以一维卷积为例,假设输入向量 x = [ a , b , c , d , e , f , g ] T x=[a,b,c,d,e,f,g]^T x=[a,b,c,d,e,f,g]T,卷积和 K = [ x , y , z ] K=[x,y,z] K=[x,y,z],卷积核的滑动步长为2, 则输出向量为:
y − x ∗ K = [ a x + b y + c z c x + d y + e z e x + f y + g z ] = [ x y z 0 0 0 0 0 0 x y z 0 0 0 0 0 0 x y z ] [ a b c d e f g ] = A x (1.2) y-x*K= \left[ \begin{matrix} ax+by+cz \\ cx+dy+ez \\ ex+fy+gz \\ \end{matrix} \right] = \left[ \begin{matrix} x & y & z & 0 & 0& 0 & 0 \\ 0 & 0 & x & y & z & 0 & 0 \\ 0 & 0& 0 & 0 & x & y & z \\ \end{matrix} \right] \left[ \begin{matrix} a \\ b \\ c\\ d\\ e\\ f\\ g\\ \end{matrix} \right]=Ax \tag{1.2} yxK= ax+by+czcx+dy+ezex+fy+gz = x00y00zx00y00zx00y00z abcdefg =Ax(1.2)
反过来,记 A T A^T AT为矩阵 A A A的转置,定义如下矩阵运算
y ^ = A T x ^ (1.3) \widehat{y}=A^T\widehat{x}\tag{1.3} y =ATx (1.3)
其所对应的操作被称为转置卷积,其中 y ^ \widehat{y} y x ^ \widehat{x} x 分别是转置卷积的输入和输出,维度分别是 d ( i ) d^{(i)} d(i) d ( o ) d^{(o)} d(o)。转置卷积也可以称为反卷积,它可以看做是普通卷积的一个对称操作,这种“对称性”体现在以下两个方面:

  • 转置卷积能将普通卷积中输入到输出的尺寸变换逆反过来,
  • 根据矩阵运算的求导知识,在式 (1.1) 所示的普通卷积中,输出 y 对于输入 x 的导数为∂y/∂x = A;而在式 (1.2) 所示的转置卷积中,输出 y 对于输入 x 的导数为∂y/∂x = A。由此可以看出,转置卷积的信息正向传播与普通卷积的误差反向传播所用的矩阵相同,反之亦然。

以式( 1.2 ) 为例 , 我们可以写出转置卷积的具体计算公式:
在这里插入图片描述
可以看到,等号的右侧实际上就是一个普通卷积对应的矩阵乘法。因此,转置卷积本质上就是一个对输入数据进行适当变换(补零/上采样)的普通卷积操作。在具体实现时,以二维卷积为例,一个卷积核尺寸为 K H × K W K_H\times K_W KH×KW、移动步长为 ( S H , S W ) (S_H,S_W) (SH,SW)、边界填充尺寸为 ( P H , P W ) (P_H,P_W) (PH,PW)的普通卷积,其对应的转置卷积可以按照如下步骤来进行。
普通卷积和转置卷积所处理的基本任务是不同的。前者主要用来进行特征提取,倾向于压缩特征图尺寸;后者主要用于对特征图进行扩张或上采样,代表性的应用场景如下:

  • 语义分割/实例分割等任务:由于需要提取输入图像的高层语义信息,网络的特征图尺寸一般会先缩小进行聚合。此外,这类任务一般需要输出与原始图像大小一致的像素级分割结果,因而需要扩张前面得到的语义信息较高的特征图,这就用到了转置卷积。
  • 一些物体检测、关键点检测任务,需要输出与源图像大小一致的结果。
  • 图像的自编码器、变分自编码器、生成式对抗网络等。

3. 空洞卷积

在语义分割(Semantic Segmentation)任务中,一般需要先缩小特征图尺寸,进行信息聚合,然后再复原到之前的尺寸,最终得到与原始图像尺寸相同的分割结果图。常见的语义分割模型,如全卷积网络(Fully Convolutional Networks,FCN),一般采用池化操作来扩大特征图的感受野,但这同时会降低特征图的分辨率,丢失一些信息(如内部数据结构、空间层级信息等),导致后续的上采样操作(如转置卷积)无法还原一些细节,从而限制最终分割精度的提升。

那么,如何不通过池化等下采样操作就能扩大感受野呢?空洞卷积应运而生。顾名思义,空洞卷积就是在标准的卷积核中注入“空洞”,以增加卷积核的感受野。空洞卷积引入了扩张率(dilation rate)这个超参数来指定相邻元素之间的间隔。扩张率为 r 的空洞卷积,其卷积核上相邻数据点之间有 r - 1 个空洞,如图 1.7 所示。
在这里插入图片描述
(图中有绿点的方格表示有效的数据点,黄色方格为空)。尺寸为 k w × k h k_w×k_h kw×kh 的标准卷积核,在扩张率为 r 的空洞卷积中,其尺寸变为 k e + ( r − 1 ) ( k − 1 ) , e ∈ [ w , h ] k_e+(r-1)(k-1),e∈[w,h] ke+(r1)(k1),e[w,h]。扩张率为 1 的空洞卷积实际上就是标准卷积(即无空洞)。

空洞卷积感受野的计算与上一节中介绍的普通卷积感受野的计算方法一致,只是其中的卷积核尺寸变为扩张后的空洞卷积核尺寸(即包括空洞在内)。以图 1.7 为例,假设依次使用图 1.7(a)、(b)、(c)中的空洞卷积构建三层神经网络:第一层是图 1.7(a)中 r=1 的空洞卷积,扩张后的卷积核尺寸为 3×3;第二层是图 1.7(b)中 r=2 的空洞卷积,扩张后的卷积核尺寸为 5×5;第三层是图 1.7(c)中 r=4 的空洞卷积,扩张后的卷积核尺寸为 9×9。根据上文中介绍的感受野计算公式,可以得到第一层、第二层、第三层的感受野依次为 3×3、7×7、15×15(如图 1.7 中深色阴影部分所示)。如果采用标准的 3×3 卷积核,则三层连接起来的感受野只有 7×7。因此,可见使用空洞卷积扩大了卷积核尺寸,不经过下采样操作即可扩大感受野,同时还能保留数据的内部结构。

4. 可变形卷积

普通的卷积操作是在固定的、规则的网格点上进行数据采样,如图 1.8(a)所示。这束缚了网络的感受野形状,限制了网络对几何形变的适应能力。为了克服这个限制,可变形卷积在卷积核的每个采样点上添加一个可学习的偏移量(offset),让采样点不再局限于规则的网格点,如图 1.8(b)所示。图 1.8(c)和图 1.8(d)是可变形卷积的两个特例:前者在水平方向上对卷积核有较大拉伸,体现了可变形卷积的尺度变换特性;后者则是对卷积核进行旋转。特别地,图 1.8(c)中的可变形卷积核形状类似于上一问中的空洞卷积,实际上,空洞卷积可以看作一种特殊的可变形卷积。
在这里插入图片描述
可变形卷积使网络具有了学习空间几何形变的能力。具体来说,可变形卷积引入了一个平行分支来端到端地学习卷积核采样点的位置偏移量。如图 1.9 所示,该平行分支先根据输入特征图计算出采样点的偏移量,然后再在输入特征图上采样对应的点进行卷积运算。这种结构让可变形卷积的采样点能根据当前图像的内容进行自适应调整。
在这里插入图片描述

我们以二维卷积为例,详细说明可变形卷积的计算过程。假设卷积核尺寸为 3×3,记 R = {(-1,-1)、(-1,0)、(-1,1)、(0,-1)、(0,0)、(0,1)、(1,-1)、(1,0)、(1,1)},它对应着卷积核的 9 个采样点。首先来看普通卷积,可以用公式形式化为:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n ) (1.3) y(p_0)=\sum_{p_n∈R}w(p_n)·x(p_0+p_n)\tag{1.3} y(p0)=pnRw(pn)x(p0+pn)(1.3)
其中, x ( ⋅ ) x(·) x() y ( ⋅ ) y(·) y()分别是卷积层的输入特征图和输出特征图,$p_0 是卷积窗的中心点, 是卷积窗的中心点, 是卷积窗的中心点,p_n$ 是卷积核的采样点。对于可变形卷积,它的计算公式则是:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n + Δ p n ) (1.4) y(p_0)=\sum_{p_n∈R}w(p_n)·x(p_0+p_n+\Delta p_n)\tag{1.4} y(p0)=pnRw(pn)x(p0+pn+Δpn)(1.4)
其中 Δ p n \Delta p_n Δpn 是采样点的位置偏移量。由于 Δ p n \Delta p_n Δpn是在网络中端到端地学习得到的,它可能不是整数,这会导致 p 0 + p n + Δ p n p_0+p_n+\Delta p_n p0+pn+Δpn不在整数网格点上,此时需要采用双线性插值:
x ( p ) = ∑ q G ( q , p ) ⋅ x ( q ) (1.5) x(p)=\sum_q G(q,p)·x(q) \tag{1.5} x(p)=qG(q,p)x(q)(1.5)
其中,p 是任意位置点(例如取 p = p 0 + p n + Δ p n p=p_0+p_n+\Delta p_n p=p0+pn+Δpn),q是整数网格点,
G ( q , p ) = m a x ( 0 , 1 − ∣ q x − p x ∣ ⋅ m a x ( 0 , 1 − ∣ q y − p y ∣ ) G(q,p)=max(0,1-|q_x-p_x|·max(0,1-|q_y-p_y|) G(q,p)=max(0,1qxpxmax(0,1qypy)
是双线性插值核。
适应物体在不同图片中出现的复杂几何形变(如尺度、形态、非刚性形变等),一直是物体识别领域的难点。可变形卷积网络给出了一个可行的解决方案,它可以端到端地学习几何形变的偏移量,不需要额外的监督信息,并且只增加了少许计算量,最终能带来性能的显著提升。图 1.10 是可变形卷积的一组效果示意图,图中结点是激活点,红点是激活点对应的三层 3×3 可变形卷积表示的采样位置(其有 9×9×9 = 729 个点)。可以看到,红色采样点基本覆盖了检测物体的全部区域,这说明可变形卷积会根据物体的尺度、形态进行自适应调整。
在这里插入图片描述

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

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

相关文章

协程的原理与实现:GMP源码走读

在计算机科学领域,尤其是在现代软件开发中,高并发处理能力是衡量技术架构性能的关键指标之一。Go语言,以其简洁的语法和内置的协程支持,为开发者提供了一套高效且易于使用的并发编程模型。本文深入剖析了Go语言协程的原理与其实现…

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里,而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用,用完后还应该正确关闭。如果没有正确关闭,它们就会在下次打开时自动进行修复。因为修复可能会花很长…

软件测试学习笔记丨Pytest的使用

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail,自动失败重试等处理能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/ap…

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代,‌路由器作为连接互联网的重要设备,‌扮演着举足轻重的角色。‌其中,‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义,‌揭示其背后…

元学习之如何学习

首先第一个步骤(如图1所示)是我们的学习算法里要有一些要被学的东西,就像在 机器学习里面神经元的权重和偏置是要被学出来的一样。在元学习里面,我们通常会考虑要 让机器自己学习网络的架构,让机器自己学习初始化的参数…

echarts 水平柱图 科技风

var category [{ name: "管控", value: 2500 }, { name: "集中式", value: 8000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 } ]; // 类别 var total 10000; // 数据…

RockyLinux8.9上yum安装redis6

我百思不得其解的一个问题 我想在RockyLinux8.9上安装redis6,通过yum list | grep redis看到的redis版本只有redis5 appstream-official仓库是我新加的,这里先不管 于是我通过浏览器访问appstream仓库https://dl.rockylinux.org/vault/rocky/8.9/AppSt…

MQTT broker搭建并用SSL加密

系统为centos,基于emqx搭建broker,流程参考官方。 安装好后,用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配…

ANSA联合abaqus的转动副创建方式

下面链接详细介绍了ANSA联合Abaqus创建转动副的过程: https://www.bilibili.com/video/BV1cb421b7z9/?spm_id_from333.880.my_history.page.clickhttps://www.bilibili.com/video/BV1cb421b7z9/?spm_id_from333.880.my_history.page.click

复盘高质量Vision Pro沉浸式视频的制作流程与工具

在探索虚拟现实(VR)和增强现实(AR)技术的过程中,高质量的沉浸式体验是至关重要的。最近,国外开发者Dreamwieber在其作品中展示了如何使用一系列工具和技术,创造出令人震撼的Vision Pro沉浸式视频。本文将详细复盘Dreamwieber的工作流,希望能为从事相关领域的开发者们提…

综合评价 | 基于熵权-变异系数-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响(即权重&…

【JAVA入门】Day34 - Stream流

【JAVA入门】Day34 - Stream流 文章目录 【JAVA入门】Day34 - Stream流一、Stream 流的作用和使用步骤1.Stream流的创建,数据的添加2. Stream流的中间方法3. Stream流的终结方法 Stream 流有什么作用?我们看一个例子: 【练习】需求&#xff…

SQL的高级查询练习知识点下(day26)

1 学习目标 重点掌握分组查询的语法 重点掌握分页查询的语法 2 分页查询 2.1 语法 SELECT 字段|表达式,... FROM 表 [WHERE 条件] [GROUP BY 分组字段] [HAVING 条件] [ORDER BY 排序的字段] LIMIT [起始的条目索引,]条目数; 2.2 特点 起始条目索引从0开始 limit子句放在…

ARM32开发——GD32F4 DMA功能查询

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 DMA0DMA1 DMA0 DMA1

蔬菜识别数据集 蔬菜数据集 用于训练,有十种蔬菜,如图已经标注好的版本

数据集概述 该数据集包含十种常见的蔬菜:胡萝卜、包菜、水果辣椒、青瓜、南瓜、土豆、花菜和西红柿。数据集已经进行了精细的标注,适用于深度学习模型的训练,尤其是用于物体检测和分类任务。 数据集特点 种类多样:涵盖了八种蔬菜…

Github 2024-09-07Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Python项目1Go项目1Polars: Rust中的DataFrame接口和OLAP查询引擎 创建周期:1354 天开发语言:Rust, Python协议类型:MIT …

Vue-Pinia状态管理案列Demo

上一篇文章已经介绍了pinia的基本使用,现在做一个小的案列来巩固。 数据绑定修改pinia中的状态。 在页面刷新的时候会显示pinia中的数据 import { createApp } from vue // import ./style.css import App from ./App.vueimport { createPinia } from pinia cons…

心觉:接纳父母,就是接纳自己---创富第一步

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松搞定人生挑战,实现心中梦想! 挑战日更写作162/1000(完整记录在下面) 公门洞开纳百川 众心逐梦越千山 号召引领潜力绽 心觉潜意识无间 很多人抱怨父母&…

Linux是如何收发网络包的

Linux网 络协议栈 从上述⽹络协议栈,可以看出: 收发流程 ⽹卡是计算机⾥的⼀个硬件,专⻔负责接收和发送⽹络包,当⽹卡接收到⼀个⽹络包后,会通过 DMA 技术,将⽹络包放⼊到 Ring Buffer ,这个是…

解决 Tomcat 启动时 JAR 包 `Invalid byte tag in constant pool` 异常问题

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…