【DL学习笔记】各种卷积操作总结(深度可分离、空洞、转置、可变形)

Vanilla Convolution 普通卷积

在这里插入图片描述
卷积通道数:

  • 卷积核的数量决定输出的张量的通道数nnn,输入的张量和每一个核Kernel做卷积运算得到一个channel的输出。
  • 输入通道数CinC_{in}Cin决定每一个卷积核的通道数

卷积输出feature map的尺寸的计算公式:

  • W_out=Win+2Pw−KwSw+1W\_out = \frac{W_{in} + 2P_w - K_w}{S_w} + 1W_out=SwWin+2PwKw+1
  • H_out=Hin+2Ph−KhSh+1H\_out = \frac{H_{in} + 2P_h - K_h}{S_h} + 1H_out=ShHin+2PhKh+1

其中,输入的尺寸为 (Win,Hin)(W_{\text{in}}, H_{\text{in}})(Win,Hin),卷积核的尺寸为 (Kw,Kh)(K_w, K_h)(Kw,Kh),步幅为 (Sw,Sh)(S_w, S_h)(Sw,Sh),填充为 (Pw,Ph)(P_w, P_h)(Pw,Ph),输出的尺寸为 (Wout,Hout)(W_{\text{out}}, H_{\text{out}})(Wout,Hout)

Group Convolution 分组卷积

Group convolution(分组卷积)最早是在AlexNet(Alex Krizhevsky等人于2012年提出的深度神经网络模型)中引入的。在 AlexNet中,作者们使用了分组卷积来将计算分布到多个GPU上。

计算

在这里插入图片描述

Group Convolution :将输入的 feature map张量 在 channel 的维度上进行分组,然后再对每个分组 分别进行卷积操作,再将各个输出沿channel维度拼接在一起。

参数量

Group Convolution 优点为可减小参数量。

如下图,假设输入尺寸为 Cin×H×WC_{in} \times H \times WCin×H×W,卷积核尺寸为 K×KK \times KK×K,输出的 Channel 数为 nnn,我们对于相同的输入和输出尺寸,分别使用 普通卷积 和 分组卷积来进行操作,并对比两种卷积方式的参数量。

在这里插入图片描述

  • 普通卷积:每个Kernel参数量为K×K×CinK \times K \times C_{in}K×K×Cin 一共有nnn个Kernel,总共参数量为:
    K×K×Cin×nK \times K \times C_{in} \times n K×K×Cin×n
  • 分组卷积:将输入分为ggg个组,每个组进入普通卷积的channel数为 Cing\frac{C_{in}}{g}gCin,要保证最后沿channel维度拼接后为nnn,所以每个普通卷积的数维度为ng\frac{n}{g}gn,所以每个组用的卷积核参数量为 K×K×Cing×ngK \times K \times \frac{C_{in}}{g} \times \frac{n}{g}K×K×gCin×gn,一共ggg个组,所以总参数量为:
    (K×K×Cing×ng)×g=K×K×Cin×ng(K \times K \times \frac{C_{in}}{g} \times \frac{n}{g} ) \times g = K \times K \times C_{in}\times \frac{n}{g} (K×K×gCin×gn)×g=K×K×Cin×gn

所以分组卷积是普通卷积参数量的1g\frac{1}{g}g1

代码实现

  • 使用普通卷积方法 torch.nn.conv2d(),通过参数 groups 指定组数
  • 注意:in_channelsout_channels 都必须可以被 groups 整除,否则会报错, 类似 :ValueError: in_channels must be divisible by groups
import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=15, kernel_size=3, groups=5, stride=1, padding=1)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 15, 20, 20])

Depth-wise Convolution 逐深度卷积

是分组卷积的特例:当Group Convolution 的分组数量 ggg 最大,等于输入channel 数CinC_{in}Cin时,就变为了 Depth-wise Convolution逐深度卷积。

计算

将输入的每个通道(channel)独立地进行 普通卷积运算(CinC_{in}CinCoutC_{out}Cout都为1),每个通道使用一个单独的卷积核进行处理,即为 DWConvolution

具体做法如下:

  • 将输入特征图按照 channel 进行分组,每个 channel 一个组,即 g=Cing = C_{in}g=Cin
  • 每个 channel (即每个 group ) 使用一个独立的卷积核(大小为 1×k×k1 \times k \times k1×k×k )对其对应通道做卷积运算,输入输出通道均为 1

在这里插入图片描述

和Group Convolution的优点一样,参数量和计算量小。

代码实现

nn.Conv2d 的参数 out_channelsgroups 都设置为等于 in_channels

import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, groups=10, stride=1, padding=1)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 10, 20, 20])

Point-wise Convolution 逐点卷积

是特殊的普通卷积,kernel_size=1x1,也就是我们经常看到的一乘一卷积 conv 1x1
因为感受野是1x1,没有融合垂直于channl维度的平面上的信息,所以它通常用来组合每个像素各个通道之间的特征信息。
在这里插入图片描述

优点 :参数量和计算量小

代码实现:将 nn.Conv2d 的参数 kernel_size 设置为等于 1

import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=1, stride=1)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 10, 20, 20])

Depth-wise Separable Convolution 深度可分离卷积

提出背景

Depth-wise Separable Convolution(深度可分离卷积)最早是由Google的研究团队在2014年提出的。该方法首次出现在论文《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》中。

计算

Depth-wise Separable Convolution 是

  • 先做一个 Depth-wise Convolution ,后面再做一个 Point-wise Convolution
  • 或者 先做一个 Depth-wise Convolution ,后面再做一个 Point-wise Convolution

计算量

Depth-wise Separable Convolution 的优势是 极大的减小了卷积的计算量。

这里还是对于相同的输入和输出尺寸,对比普通卷积核深度可分离卷积的计算量。
输入尺寸DF×DF×MD_F\times D_F \times MDF×DF×M,输出通道数为NNN

1、普通卷积计算量

在这里插入图片描述
对于普通卷积,计算量公式:
Dk⋅Dk⋅M⋅N⋅DF⋅DF(1)D_k \cdot D_k \cdot M \cdot N \cdot D_F \cdot D_F \tag{1} DkDkMNDFDF(1)

2、深度可分离卷积(Depth-wise Separable Convolution)计算量

在这里插入图片描述

计算量分为两部分:

  • Depth-wise 卷积:计算量为 Dk⋅Dk⋅M⋅DF⋅DFD_k \cdot D_k \cdot M \cdot D_F \cdot D_FDkDkMDFDF
  • Point-wise 卷积:计算量为 (1⋅1⋅M⋅DF⋅DF)⋅N(1\cdot 1\cdot M \cdot D_F \cdot D_F) \cdot N(11MDFDF)N

深度可分离卷积计算量公式:
Dk⋅Dk⋅M⋅DF⋅DF+M⋅N⋅DF⋅DF(2)D_k \cdot D_k \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F \tag{2} DkDkMDFDF+MNDFDF(2)

3、计算量对比(公式(2) ÷ 公式(1))

为对比普通卷积与深度可分离卷积的计算量,用作商法比大小,将公式(2)除以公式(1),推导得:

Dk⋅Dk⋅M⋅DF⋅DF+M⋅N⋅DF⋅DFDk⋅Dk⋅M⋅N⋅DF⋅DF=1N+1Dk2(3)\frac{D_k \cdot D_k \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F}{D_k \cdot D_k \cdot M \cdot N \cdot D_F \cdot D_F} = \frac{1}{N} + \frac{1}{D_k^2} \tag{3} DkDkMNDFDFDkDkMDFDF+MNDFDF=N1+Dk21(3)

4、典型场景(Dk=3D_k = 3Dk=3,即 3×3 卷积)

实际常用 3×3 卷积(Dk=3D_k = 3Dk=3 ),代入公式(3)得:

1N+1Dk2=1N+19\frac{1}{N} + \frac{1}{D_k^2} = \frac{1}{N} + \frac{1}{9} N1+Dk21=N1+91

5、结论

理论上,普通卷积计算量是深度可分离卷积的 8~9 倍(因NNN为输出channel数往往很大,所以 1N\frac{1}{N}N1 通常很小,主导项为 $ \frac{1}{9} $ ,故整体约为 9 倍 )。

Dilation/Atrous Convolution 膨胀卷积/空洞卷积

计算与代码实现

  • 普通卷积输出的每个像素是输入的连续的像素与卷积核运算得到的。
  • 膨胀卷积输出的每个像素是输入的有间隔的像素与Kernel运算得到的。

在这里插入图片描述

作用:增大卷积核的感受野。
感受野(Receptive Field)指CNN网络中,每个特征图的每个像素点对应输入图像的区域大小。

代码实现:指定nn.Conv2d()的膨胀率参数 dilation

  • 当 dilation=1 时,没有间隔,是普通卷积
  • 当 dilation=2 时,卷积核元素中间间隔一个像素
import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, stride=1, padding=2, dilation=2)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 10, 20, 20])

padding参数设置

在这里插入图片描述
在这里插入图片描述
要保证输入输出的大小尺寸不变

  • 普通卷积:步长stride=1,填充padding=1,即原图多加一圈像素。
  • 膨胀卷积:步长stride=1,填充padding=2,加两圈像素。

缺点:网格效应Gridding Effect

由于膨胀卷积是一种稀疏的采样方式,当多个膨胀卷积叠加时,有些像素根本没有被利用到,会损失信息的连续性与相关性,进而影响分割、检测等要求较高的任务。

比如这里连续用了两次膨胀卷积得到的feature map中的一个绿色的像素,回溯回去是由紫色像素得到的。所以如果整个网络只有两层膨胀卷积的话,相当于只有原图的四分之一的像素用到了。
在这里插入图片描述

Transposed Convolution 转置卷积

转置卷积也是卷积,只不过转置卷积 是一种上采样操作
如下图的转置卷积所示,输入图像尺寸为 2x2, 输出图像的尺寸为 4x4。
在这里插入图片描述

参数设置

如何设置 转置卷积 的 stride 和 padding
在这里插入图片描述

已知 input 和 kernel 求 output

在这里插入图片描述

Deformable Convolution 可变形卷积

论文:《Deformable Convolutional Networks》

普通卷积公式:
y(p0)=∑pn∈Rw(pn)⋅x(p0+pn)\mathbf{y}(\mathbf{p}_0) = \sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}(\mathbf{p}_n) \cdot \mathbf{x}(\mathbf{p}_0 + \mathbf{p}_n) y(p0)=pnRw(pn)x(p0+pn)

  • y(p0)\boldsymbol{y(p_0)}y(p0):输出特征图在位置 p0\boldsymbol{p_0}p0 处的值
  • w(pn)\boldsymbol{w(p_n)}w(pn):卷积核(权重)在位置 pn\boldsymbol{p_n}pn 处的参数
  • x(p0+pn)\boldsymbol{x(p_0 + p_n)}x(p0+pn):输入数据在位置 p0+pn\boldsymbol{p_0 + p_n}p0+pn 处的原始值
  • R\mathcal{R}R:卷积核的作用范围(即卷积核覆盖的所有位置集合,决定卷积的“视野”)

简单说,就是输出位置的值 = 卷积核权重与输入对应区域的加权求和

可变性卷积公式:y(p0)=∑pn∈Rw(pn)⋅x(p0+pn+Δpn)\mathbf{y}(\mathbf{p}_{0})=\sum_{\mathbf{p}_{n}\in\mathcal{R}}\mathbf{w}(\mathbf{p}_{n})\cdot\mathbf{x}(\mathbf{p}_{0}+\mathbf{p}_{n}+\Delta\mathbf{p}_{n})y(p0)=pnRw(pn)x(p0+pn+Δpn)

  • y(p0)\mathbf{y}(\mathbf{p}_0)y(p0):输出特征图在位置 p0\mathbf{p}_0p0 处的像素值
  • R\mathcal{R}R:卷积核的固定感受野范围(如 3×3 卷积的 9 个位置集合)
  • w(pn)\mathbf{w}(\mathbf{p}_n)w(pn):卷积核在固定位置 pn\mathbf{p}_npn 处的权重参数
  • x(⋅)\mathbf{x}(\cdot)x():输入特征图
  • Δpn\Delta\mathbf{p}_nΔpn:偏移量表示卷积核第 nnn 个采样点相对于固定位置 pn\mathbf{p}_npn 的偏移。偏移量 Δpn\Delta\mathbf{p}_nΔpn是学习到的值,是浮点型数据,由图像经过普通卷积计算得到。

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

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

相关文章

【Ubuntu】请问,`ip -a`显示的“wlo1”是什么呀?

商量AI wlo1 是 Linux 系统中 无线网络接口(Wi-Fi 网卡)的名称,其命名遵循现代 Linux 的 可预测网络接口命名规则(Predictable Network Interface Names)。以下是详细解析:命名规则拆解 wlo1 的结构由三部分…

Excel商业智能分析报表 【销售管理分析仪】

1.销售漏斗(Sales Funnel)分析🌟🌟 销售漏斗定义:科学反映商机状态及销售效率的销售管理模型。适用场景:关系型销售运营(需长期维护客户关系的销售模式)。核心功能:按销售…

【论文阅读|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】

论文题目:V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING 年份:2024 期刊会议: arXiv 代码链接:https://github.com/wangck20/V2M 目录 现阶段存在的问题 1. 二维结构信息丢失 2. 一维 Mamba 架构的局限性 3. 提升视觉任务表现 相关研究 方法 二维…

服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份

更多云服务器知识,尽在hostol.com你的网站,就像一座你亲手在数字海滩上堆砌起来的、精美绝伦的“沙堡”。你为它设计了独特的风格,添置了丰富的内容,吸引了越来越多的游客前来参观。每一篇文章,每一条评论,…

AdGuard 安卓修改版:全方位广告拦截与隐私保护专家

AdGuard 安卓版是一款功能强大的广告拦截软件,能够有效阻止网页和应用程序中的广告和跟踪器,提升用户的浏览体验。它不仅提供了广泛的广告拦截功能,还通过多种隐私保护功能,确保用户的个人信息安全。以下是 AdGuard 安卓版的详细介…

Mysql中的锁到底是什么?锁的是什么?

MySQL InnoDB 的锁:一次从“守卫”到“交通指挥中心”的深度之旅 MySQL InnoDB 的锁。这个概念常常让人觉得复杂抽象,但我们需要抓住它的底层设计哲学 忘记那些代码和术语定义,我们先从最底层的问题开始思考: 思考一:为…

CVE-2020-24557

一、漏洞原理 CVE-2020-24557 是 D-Link 路由器(如 DIR-816L2) 中存在的一个 命令注入(Command Injection) 漏洞,其核心原理为: ①路由器的管理界面(Web 或 CGI 接口)在处理某些用户…

proxychains——Linux代理工具

简介 ProxyChains是一个UNIX程序,通过预加载动态库(dlsym(),LD_PRELOAD)劫持动态链接程序中与网络相关的libc函数,将连接重定向至SOCKS4a/5或HTTP代理。仅支持TCP协议(不支持UDP/ICMP等)。它的工作方式基本…

精确调控建筑环境,楼宇自控系统大幅提升居住舒适度

在现代城市化进程中,建筑环境的舒适度已成为衡量生活质量的重要指标。随着科技的飞速发展,楼宇自控系统(Building Automation System, BAS)正以前所未有的精准度重新定义人与空间的互动关系。这套集成了物联网、大数据和人工智能的…

Echarts中的水波图、水球图、水半球实现的详细步骤(vue)

目录 一、实现效果 二、实现步骤 1. 安装ECharts和Liquid Fill插件 2. 创建一个组件 3.在创建的vue中引入ECharts和Liquid Fill插件 4.在组件中初始化ECharts和Liquid Fill插件 5.完整代码 一、实现效果 Echarts中的水位图(水波图、水球图、水半球)…

Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?

父组件 通过 :issueDeptId this.form109.issueDeptId传数据到子组件 <inv-info ehco-data"selectOutInvId" :purposeId this.form109.purposeId:issueDeptId this.form109.issueDeptId:projectNo this.form109.projectNo:invPhysicIds this.form109.issuePh…

如何通过主数据治理重构企业系统竞争力

在当前企业数字化转型持续深化的背景下&#xff0c;IT系统复杂度与数据规模呈指数级增长。CRM、ERP、HRM、供应链、电商平台等多系统并行运作已成为常态。然而&#xff0c;随之而来的主数据&#xff08;Master Data&#xff09;管理难题&#xff0c;正日益成为制约系统稳定性、…

c++ 中 原子锁、互斥锁、自旋锁的区别和详细用法

用最生活化的比喻来解释 C 中原子锁、互斥锁和自旋锁的区别和用法&#xff0c;让小白也能秒懂&#xff01;&#x1f604;想象你 ​​&#xff08;线程&#xff09;​​ 要去公共更衣室 ​​&#xff08;共享资源&#xff0c;如变量、数据结构&#xff09;​​ 换衣服。这个更衣…

RabbitMQ面试精讲 Day 12:镜像队列与Quorum队列对比

【RabbitMQ面试精讲 Day 12】镜像队列与Quorum队列对比 开篇&#xff1a;面试价值与核心要点 在RabbitMQ集群环境中&#xff0c;如何保证消息的高可用性是最常被问及的面试问题之一。今天我们将深入探讨RabbitMQ提供的两种高可用队列实现方案&#xff1a;经典镜像队列(Mirror…

Maven 常用命令详解

前言 Apache Maven 是 Java 项目管理和构建自动化工具&#xff0c;它通过一个项目对象模型&#xff08;POM, Project Object Model&#xff09;来管理项目的构建、报告和文档。Maven 的核心优势在于其强大的依赖管理、标准化的项目结构以及丰富的插件生态系统。掌握 Maven 的常…

Android Studio切换到经典UI,老UI

为什么要写这边文章&#xff0c;我自己的android studio年儿半载安装一次新的&#xff0c;所以记录一下。1、新android studio安装后都是新工作室风格的UI。2、菜单File ->Settings ,在Setting界面将Enable New UI 的勾选去掉&#xff0c;点击OK&#xff0c;重启Android Stu…

走进“Mesh无线自组网”:开启智能家居和智慧工厂

随着科技的迅猛发展&#xff0c;互联网已经渗透到我们生活的方方面面&#xff0c;而其中最引人瞩目的便是“智能家居”和“智慧工厂”。这些新兴领域的飞速发展&#xff0c;离不开底层网络技术的支持。众多的网络通信技术中&#xff0c;Mesh无线自组网以其独特的优势&#xff0…

力扣热题100——双指针

双指针两数之和&#xff08;有序数组&#xff0c;相向双指针&#xff09;问题&#xff1a;在有序数组中找到两个数&#xff0c;使它们的和等于目标值。思路&#xff1a;左指针从起点出发&#xff0c;右指针从终点出发&#xff0c;根据和与目标值的大小调整指针。 #include <…

AI Infra与LLM的联系与差异

一、定义与定位LLM&#xff08;大语言模型&#xff09; 定义&#xff1a;基于海量文本训练的深度学习模型&#xff0c;通过Transformer架构实现语言理解与生成&#xff0c;典型代表如GPT-4、通义千问等。定位&#xff1a;AI应用的核心能力层&#xff0c;直接面向用户提供文本生…

数据结构-双链表

学习完单链表&#xff0c;现在继续学习双链表一、双链表结构带头双向循环链表&#xff08;简称&#xff1a;双链表&#xff09;注意&#xff1a;这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好…