不同卷积方法一览(+部分代码)

article/2025/10/7 11:56:29

关键词

卷积方法:2D / 3D / 1x1 /转置/扩张(Atrous)/空间可分/深度可分/平展/分组/混洗分组/逐点分组卷积

卷积网络:全卷积FCN(Fully Convolutional Network),可变形卷积(Deformable Convolutional Network)


2D卷积

假设输入层的大小是 7×7×3(高×宽×通道),而过滤器的大小是 3×3×3。经过与一个过滤器的 2D 卷积之后,输出层的大小是 5×5×1(仅有一个通道)。使用多个过滤器就会有多个通道。

3D卷积

3D 卷积是 2D 卷积的泛化。下面就是 3D 卷积,其过滤器深度小于输入层深度(核大小<通道大小)。因此,3D 过滤器可以在所有三个方向(图像的高度、宽度、通道)上移动。在每个位置,逐元素的乘法和加法都会提供一个数值。因为过滤器是滑过一个 3D 空间,所以输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。

转置卷积(去卷积)TransposedConv

使用卷积来上采样

转置卷积的转置来源:矩阵与其转置矩阵的乘法得到一个单位矩阵

#tensorflow v2.9
#输入矩阵之间的空自动填充
tf.keras.layers.Conv2DTranspose(filters,       #卷积核个数kernel_size,    #卷积核大小strides=(1, 1),  #卷积核步长大小 (与空洞大小不能都不为1)padding='valid',output_padding=None,    #输出的填充data_format=None,dilation_rate=(1, 1),    #卷积核空洞大小activation=None,use_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,**kwargs
)

扩张卷积(Atrous 卷积)(Dilated Convolution)

直观而言,扩张卷积就是通过在核元素之间插入空格来使核「膨胀」。新增的参数 l(扩张率)表示我们希望将核加宽的程度。具体实现可能各不相同,但通常是在核元素之间插入 l-1 个空格。

可分卷积Separable Conv

可分卷积有空间可分卷积和深度可分卷积。某些神经网络架构比如 MobileNets使用了可分卷积。

空间可分卷积

空间可分卷积操作的是图像的 2D 空间维度,即高和宽。从概念上看,空间可分卷积是将一个卷积分解为两个单独的运算。比如将3x3的Sobel 核被分成了一个 3×1 核和一个 1×3 核

 此外,使用空间可分卷积时所需的矩阵乘法也更少

尽管空间可分卷积能节省成本,但深度学习却很少使用它。一大主要原因是并非所有的核都能分成两个更小的核。如果我们用空间可分卷积替代所有的传统卷积,那么我们就限制了自己在训练过程中搜索所有可能的核。这样得到的训练结果可能是次优的。

深度可分卷积 Depthwise Convolution

相比2D卷积,深度卷积分开使用 3 个核。每个过滤器的大小为 3×3×1。每个核与输入层的一个通道卷积(仅一个通道,而非所有通道!)。每个这样的卷积都能提供大小为 5×5×1 的映射图。然后我们将这些映射图堆叠在一起,创建一个 5×5×3 的图像。

深度可分卷积效率优势很大,但会降低卷积中参数的数量。因此,对于较小的模型而言,如果用深度可分卷积替代 2D 卷积,模型的能力可能会显著下降。

分组卷积Grouped conv

分组个数和通道数一致的话就是深度可分卷积。起初被AlexNet用于并行化计算

平展卷积

直觉上看,平展卷积的理念是滤波器分离。我们不应用一个标准的滤波器将输入映射到输出,而是将此标准的滤波器分解为3个1D滤波器。这种想法与上述空间可分卷积类似,其中的一个空间滤波器近似于两个 rank-1 过滤器(秩1矩阵),而秩1矩阵可表示为一列基乘以一行基的形式A=UV^T,最后分解得到3个1D滤波器。

混洗分组卷积(Shuffled Grouped Convolution)

ShuffleNet中提出的一种计算效率非常高的卷积结构,随机分组卷积涉及分组卷积和通道混洗。通道混洗操作(Channel Shuffle Operation)的想法是,我们希望混合来自不同筛选器组的信息。由于经过混洗后信息已经混合,因此,通过允许通道之间的信息交换,增强了模型的表现力。

逐点分组卷积(Pointwise Grouped Convolution)

通常对于分组卷积(如 MobileNet或 ResNeXt,组操作在3 x 3空间卷积上执行,但在1 x 1卷积上不执行。ShuffleNet论文认为,1 x 1卷积在计算上也是昂贵的。并建议在1 x 1卷积上也应用分组卷积。顾名思义,逐点分组卷积执行1 x 1卷积的组操作。该操作与分组卷积相同,只有一个修改在1 x 1筛选器上执行,而不是n x n滤波器 (n>1)

这里写图片描述

 

全卷积FCN(Fully Convolutional Network)

CNN的全连接是实现图像的分类,而FCN则是用全卷积实现对图像的分割(每一个像素的分类)

比如说1000分类任务,CNN输出为1000x1的话,FCN输出的结果为1000xHxW

FCN使用反卷积的上采样跳级结构skips:

  • 跳级结构将最后一层的预测(富有全局信息)和更浅层(富有局部信息)的预测结合起来,在遵守全局预测的同时进行局部预测。
  • 跳级结构中是求和而不是取最大值:求和更容易求导,从而反向传播
  • FCN的不足:得到的结果还不够精细,对细节不够敏感;未考虑像素与像素之间的关系,缺乏空间一致性等

在这里插入图片描述

FCN-8s 网络—升采样分为三次完成。 进一步融合了第3个pooling层的预测结果:

FCN网络结构

可变形卷积DCN(2017)

可变形卷积在每一个元素上额外增加了一个参数方向参数, 使得卷积核可以根据实际情况调整本身的形状,更好的提取输入的特征

可变形卷积的学习过程: 首先偏差(offset)是通过一个卷积层获得,该卷积层的卷积核与普通卷积核一样。输出的偏差尺寸和输入的特征图尺寸一致。生成通道维度是2N,分别对应原始输出特征偏移特征。这两个卷积核通过双线性插值后向传播算法同时学习。

具体实现方法:

  1. 首先,和CNN一样,根据输入的图像,利用传统的卷积核提取特征图
  2. 把得到的特征图作为输入,对特征图再施加一个卷积层,得到可变形卷积的变形的偏移量
  3. 偏移层是2N,是因为我们在平面上做平移,需要改变 x和 y 值两个方向。
  4. 在训练的时候,用于生成输出特征的卷积核和用于生成偏移量的卷积核是同步学习的。其中偏移量的学习是利用插值算法,通过反向传播进行学习。

计算类似Spatial Transformer Networks(STN)


Pytorch代码

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

输入输出形状:

dilation 参数控制kernel的间隔

groups 参数控制分组卷积(深度可分卷积)。in_channelsout_channels 需要能被 groups整除。

  • At groups=1, all inputs are convolved to all outputs.

  • At groups=2, the operation becomes equivalent to having two conv layers side by side, each seeing half the input channels and producing half the output channels, and both subsequently concatenated.

  • At groups= in_channels, each input channel is convolved with its own set of filters (of size out_channels / in_channels​).


拓展:更多的卷积

  • GhostNet:堆叠卷积层
  • SCConv:自校正卷积,长距离空间和通道依赖性的校准操作
  • DO-Conv:传统卷积和深度卷积结合
  • 内卷(Involution):内卷核由原图像信息通过变换函数得到


References

卷积有多少种?一文读懂深度学习中的各种卷积

详述Deep Learning中的各种卷积(四) - 知乎


http://chatgpt.dhexx.cn/article/s8qxtyLD.shtml

相关文章

卷积代码实现

卷积在pytorch中有两种方式&#xff0c;一种是torch.Conv2d(),一种是torch.nn.functional.conv2d&#xff08;&#xff09;&#xff0c;这两种形式本质都是使用一个卷积操作&#xff0c;下面举例来说明一下这两种卷积方式 import numpy as np import torch from torch import …

最通俗的语言讲解卷积码、码树图、状态图以及维特比译码

什么是卷积码&#xff1f; 卷积码是由伊利亚斯发明的一种非分组码&#xff0c;它更加倾向于纠错&#xff0c;对于实际的性能优于分组码&#xff0c;运算较为简单。 将卷积码记为(n,k,N),码率定义为k/n n是n个比特 k是k个信息位 N是N个信息段 卷积码编码器 组成&#xff1a…

卷积,卷积神经网络,图卷积神经网络中的“卷积”如何理解?

[] 1. 对卷积最朴素的理解 首先我们在教材上看到的卷积公式是 ∫ f ( τ ) g ( x − τ ) d τ \int f(\tau)g(x-\tau)d\tau ∫f(τ)g(x−τ)dτ。对于这个公式的理解&#xff0c;网上有很多讲解视频&#xff0c;都是用一些具体的例子来帮助我们理解卷积的过程。推荐b站上的视…

实现卷积的几种代码方式

目录 摘要 卷积&#xff08;convolution&#xff09; 1、pytorch实现 2、对input展开矩阵相乘 3、对kernel展开以及矩阵相乘 转置卷积 1、API实现 2、对kernel矩阵转置矩阵相乘 总结 摘要 卷积的基本元素有着input size、kernel size、stride、padding、group以及dil…

卷积卷积神经网络

文章目录 一、关于卷积&#xff08;convolution&#xff09;的直观感受二、卷积在不同领域的应用三、卷积神经网络&#xff08;CNN&#xff09;的诞生四、卷积神经网络&#xff08;CNN&#xff09;&#xff08;1&#xff09;为什么需要卷积层&#xff08;2&#xff09;池化&…

MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)

卷积码原理介绍 1.基本概念 首先卷积码是一种纠错码&#xff0c;让我们先从大格局出发&#xff0c;去认识卷积码。如图1所示我是先从通信原理书上了解了卷积码的概念&#xff0c;再结合网上部分资料&#xff0c;勉强搞懂&#xff0c;感觉主要需要掌握卷积码编码器、状态图、网…

通信原理学习笔记4:信道编码、分组码、卷积码、现代信道编码(Turbo码、LDPC码、Polar码)

信道编码 / 前向纠错码FEC 思想是在数据中增加冗余信息&#xff0c;即校验码元 / 监督码元&#xff0c;从而检错、纠错 信道编码的优劣评判 首先&#xff0c;最基本的是要追求低差错率 实现纠错很简单&#xff0c;只要多添加冗余信息就好&#xff1b;但实际中&#xff0c;我…

韩信点兵算法:

韩信点兵问题&#xff1a;韩信点兵不足百人&#xff0c;3人一行排列多一人&#xff0c;7人一行排列少两人&#xff0c;5人一行正好&#xff0c; 输出韩信究竟点了多少兵。 使用 math 类的DivRem 方法进行运算。 static void Main(string[] args){///韩信点兵不足百人&#xff…

韩信点兵

韩信点兵&#xff1a; 韩信带1500名兵士打仗&#xff0c;战死四五百人&#xff0c;站3人一排&#xff0c;多出2人&#xff1b;站5人一排&#xff0c;多出4人&#xff1b;站7人一排&#xff0c;多出6人。韩信马上说出人数&#xff1a;1049。 代码实现&#xff1a; <span styl…

韩信点兵(python)

韩信点兵 全部士兵按每行8人站立&#xff0c;剩余7人 全部士兵按每行7人站立&#xff0c;剩余6人 问题&#xff1a;已知每一营士兵人数在1000~2000之间&#xff0c;如何利用循环判断表示出代码逻辑 for num in range (1000,2000):if num % 87 and num %76 and num%65\and num%5…

经典算法--韩信点兵

韩信点兵是一道古代的数学题&#xff0c;题意&#xff1a;韩信点兵不足百人&#xff0c;三人一排多1人&#xff0c;七人一排少2人&#xff0c;五人一排正好。问韩信带兵多少&#xff1f; /*** 韩信点兵&#xff1a;* 韩信带兵不足百人&#xff0c;3人一排多1人&#xff0c;7人一…

枚举算法:韩信点兵。

韩信点兵。韩信在点兵的时候&#xff0c;为了知道有多少名士兵&#xff0c;同时又能保住军事机密&#xff0c;便让士兵排队报数。 按从1至5报数&#xff0c;最末一个士兵报的数为1。 再按从1至6报数&#xff0c;最末一个士兵报的数为5。 再按1至7报数&#xff0c;最末一个士兵报…

java工作流activity_activity 工作流学习(一)

启动流程实例 什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系) 为了演示:在流程图中指定办理人是谁,现在是写死的,表示只能张三能提交请假申请。后面会讲解如何动态指定。 //根据流程定义的Id启动一个流程实…

工作流:一文让你学会使用flowable工作流

1.请假流程图 下图是 一个请假申请的简单流程图 &#xff08;1&#xff09;申请人通过发起流程进行请假申请&#xff0c;给经理发送一个待审批事项&#xff1b; &#xff08;2&#xff09;经理在待办列表选择事项&#xff0c;进行审批&#xff0c;approved同意或者rejected驳回…

jeesite工作流使用

问题&#xff1a;jeesite工作流如何使用&#xff1f; 背景&#xff1a;公司没人熟悉工作流&#xff0c;现在要上线办公系统&#xff0c;请假&#xff0c;加班&#xff0c;报销&#xff0c;预审批&#xff0c;用印&#xff0c;付款等工作流要写&#xff0c;之前有简单版本&…

工作流的大致开发流程

前段时间公司在做一个oa的项目&#xff0c;用到了flowable工作流&#xff0c;刚开始的时候还在纠结于是用activity还是flowable&#xff0c;后来查了相关资料发现flowable的作者之前就是开发activity的作者&#xff0c;只不过后来自己出去又搞了一套就叫做flowable&#xff0c;…

flowable工作流所有业务概念

1.什么是工作流审批 根据本人的理解&#xff0c;就是审批流程管理。 2.什么是flowable 1.官方解释 官方解释如下&#xff1a; Flowable 项目提供了一套核心的开源业务流程引擎&#xff0c;这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管…

微服务与工作流

本文主要想谈一谈工作流在微服务系统中的使用以及工作流能够为微服务系统带来的好处。 通过查找资料可得&#xff0c;微服务的编排主要分为两种形式&#xff0c;一种是“choreography”&#xff0c;有人将其翻译成微服务的编排&#xff1b;另一种是“orchestration”,有人将其翻…

Camunda工作流引擎入门

文档集合 1、camunda文档&#xff1a;https://docs.camunda.org/get-started/quick-start/ 2、camunda资源下载&#xff1a;https://camunda.com/download/ 3、camunda示例github仓库&#xff1a;https://github.com/camunda/camunda-bpm-examples 4、camunda 代码仓库&…

工作流设计详解

工作流 概念&#xff1a; workflow流程性通知和审批控制&#xff0c;业务流程中、发送、提供附加信息或进行附加业务处理&#xff0c;两个或两个以上的人为共同目标&#xff0c;连续以并行或串行的方式完成某一业务。 工作流 设计&#xff1a; 按照业务规划流程图&#xff0…