计算机视觉的应用29-卷积神经网络(CNN)中的变种:分组卷积、转置卷积、空洞卷积的计算过程

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用29-卷积神经网络(CNN)中的变种:分组卷积、转置卷积、空洞卷积的计算过程。分组卷积将输入通道分为几组,对每组独立进行卷积操作,以减少计算量和模型参数。转置卷积也称为反卷积,它通过将输入特征图的元素扩展到更高维度的输出特征图来执行上采样。空洞卷积通过在输入特征图上引入“空洞”或“间隙”来增加感受野,从而在不增加额外参数的情况下扩大卷积核的有效覆盖范围。这些变种在CNN中用于解决不同的问题,如提高计算效率、实现上采样和扩大感受野等。

文章目录

  • 一、卷积神经网络的简述
    • 卷积的基本操作:
    • 与全连接层的区别:
    • 计算例子:
  • 二、分组卷积的简述
    • 分组卷积的基本操作:
    • 应用场景:
    • 计算例子:
  • 三、转置卷积的简述
    • 转置卷积的基本操作:
    • 应用场景:
    • 计算例子:
  • 四、空洞卷积的简述
    • 空洞卷积的基本操作:
    • 应用场景:
    • 计算例子:

一、卷积神经网络的简述

卷积是一种在图像处理和深度学习中广泛使用的数学运算,特别是在卷积神经网络(CNN)中。它通过在输入数据上滑动一个小的窗口(或称为“卷积核”或“过滤器”),并将卷积核中的值与输入数据相应位置的值相乘,然后将这些乘积求和,得到一个输出值。这个过程在整个输入数据上重复进行,以产生一个特征图(feature map),这个特征图描述了输入数据中与卷积核匹配的模式。

卷积的基本操作:

  1. 定义卷积核:首先定义一个卷积核,这是一个小的权重矩阵,用于在输入数据上滑动。例如,一个3x3的卷积核可以表示为:
    K = [ k 11 k 12 k 13 k 21 k 22 k 23 k 31 k 32 k 33 ] K = \begin{bmatrix} k_{11} & k_{12} & k_{13} \\ k_{21} & k_{22} & k_{23} \\ k_{31} & k_{32} & k_{33} \end{bmatrix} K= k11k21k31k12k22k32k13k23k33
  2. 滑动卷积核:将卷积核在输入数据上滑动,覆盖输入数据的一个局部区域。例如,对于一个5x5的输入图像 I I I,卷积核会从左上角开始,每次移动一个像素,直到覆盖整个图像。
  3. 元素相乘并求和:在每个位置,将卷积核的元素与输入图像的相应元素相乘,并将所有乘积求和。例如,如果卷积核的中心位于输入图像的左上角,计算如下:
    O u t p u t ( 1 , 1 ) = k 11 × I 11 + k 12 × I 12 + k 13 × I 13 + k 21 × I 21 + k 22 × I 22 + k 23 × I 23 + k 31 × I 31 + k 32 × I 32 + k 33 × I 33 Output_{(1,1)} = k_{11} \times I_{11} + k_{12} \times I_{12} + k_{13} \times I_{13}+ \\ k_{21} \times I_{21} + k_{22} \times I_{22} + k_{23} \times I_{23}+ \\ k_{31} \times I_{31} + k_{32} \times I_{32} + k_{33} \times I_{33} Output(1,1)=k11×I11+k12×I12+k13×I13+k21×I21+k22×I22+k23×I23+k31×I31+k32×I32+k33×I33
  4. 应用激活函数:通常,在卷积操作之后会应用一个非线性激活函数,如ReLU,来增加网络的非线性。

与全连接层的区别:

  • 局部连接:卷积层具有局部连接性,即每个卷积核只与输入数据的一个局部区域连接,而不是与所有输入数据连接。这减少了参数的数量,并允许网络捕获局部特征(如边缘、角点等)。
  • 参数共享:在卷积层中,卷积核的权重在整个输入数据上是共享的,这意味着无论卷积核在输入数据上的位置如何,都使用相同的权重。这进一步减少了参数的数量。
  • 平移不变性:卷积层具有平移不变性,即即使输入数据中的模式位置发生变化,卷积层仍能检测到该模式。
    相比之下,全连接层中的每个神经元都与前一层中的所有神经元相连,这导致了大量的参数。全连接层没有局部连接性和参数共享,因此它们在处理高维输入(如图像)时效率较低,并且不容易捕获局部特征。

计算例子:

假设我们有一个5x5的灰度图像 I I I和一个3x3的卷积核 K K K
I = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ] , K = [ 1 0 − 1 1 0 − 1 1 0 − 1 ] I = \begin{bmatrix} 1 & 2 & 3 & 4 & 5 \\ 6 & 7 & 8 & 9 & 10 \\ 11 & 12 & 13 & 14 & 15 \\ 16 & 17 & 18 & 19 & 20 \\ 21 & 22 & 23 & 24 & 25 \end{bmatrix}, \quad K = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix} I= 16111621271217223813182349141924510152025 ,K= 111000111
当卷积核的中心位于输入图像的左上角时(即覆盖 I 11 , I 12 , I 13 , I 21 , I 22 , I 23 , I 31 , I 32 , I 33 I_{11}, I_{12}, I_{13}, I_{21}, I_{22}, I_{23}, I_{31}, I_{32}, I_{33} I11,I12,I13,I21,I22,I23,I31,I32,I33),计算得到的输出为:
O u t p u t ( 1 , 1 ) = 1 × 1 + 0 × 2 + ( − 1 ) × 3 + 1 × 6 + 0 × 7 + ( − 1 ) × 8 + 1 × 11 + 0 × 12 + ( − 1 ) × 13 = − 4 Output_{(1,1)} = 1 \times 1 + 0 \times 2 + (-1) \times 3+ \\ 1 \times 6 + 0 \times 7 + (-1) \times 8+ \\ 1 \times 11 + 0 \times 12 + (-1) \times 13 = -4 Output(1,1)=1×1+0×2+(1)×3+1×6+0×7+(1)×8+1×11+0×12+(1)×13=4
这个输出将是特征图中的一个元素。卷积核将继续滑动,直到覆盖整个输入图像,生成整个特征图。
+
在上面的例子中,卷积核 K K K是一个简单的边缘检测器,它对垂直边缘的响应最大。当卷积核滑过图像时,它会突出显示图像中的垂直边缘,因为垂直边缘上的像素值变化会与卷积核中的正负权重相乘,从而产生较大的输出值。
卷积操作的输出大小取决于几个因素:输入图像的大小、卷积核的大小、步幅(stride)和填充(padding)。如果卷积核的大小为 k × k k \times k k×k,输入图像的大小为 W × H W \times H W×H,步幅为 s s s,填充为 p p p,则输出特征图的大小 O O O可以表示为:
O = ⌊ W − k + 2 p s + 1 ⌋ × ⌊ H − k + 2 p s + 1 ⌋ O = \left\lfloor \frac{W - k + 2p}{s} + 1 \right\rfloor \times \left\lfloor \frac{H - k + 2p}{s} + 1 \right\rfloor O=sWk+2p+1×sHk+2p+1
其中, ⌊ x ⌋ \left\lfloor x \right\rfloor x表示向下取整。
例如,如果我们的输入图像是5x5,卷积核是3x3,步幅是1,没有填充( p = 0 p = 0 p=0),那么输出特征图的大小将是:
O = ⌊ 5 − 3 + 2 × 0 1 + 1 ⌋ × ⌊ 5 − 3 + 2 × 0 1 + 1 ⌋ = 3 × 3 O = \left\lfloor \frac{5 - 3 + 2 \times 0}{1} + 1 \right\rfloor \times \left\lfloor \frac{5 - 3 + 2 \times 0}{1} + 1 \right\rfloor = 3 \times 3 O=153+2×0+1×153+2×0+1=3×3
这意味着我们将得到一个3x3的特征图,其中每个元素都是卷积核在输入图像上相应位置的卷积结果。
卷积操作通过局部连接和参数共享,有效地捕捉了输入数据的局部特征,并且减少了模型的参数数量,使得网络更加高效。这与全连接层形成了鲜明的对比,全连接层在处理高维数据时参数数量庞大,且无法有效地捕捉局部特征。因此,在处理图像和视频数据时,卷积神经网络(CNN)成为了首选的模型架构。

二、分组卷积的简述

分组卷积(Grouped Convolution)是一种特殊的卷积形式,它在深度神经网络中用于减少参数数量和计算量,同时也能够增加模型的非线性。在分组卷积中,输入特征图和卷积核被分成若干组,每一组内部进行常规的卷积操作,而不同组之间不进行交叉运算。

分组卷积的基本操作:

  1. 输入特征图分组:假设输入特征图的深度为 D D D,将其分为 G G G组,每组包含 D G \frac{D}{G} GD个通道。
  2. 卷积核分组:同样,将卷积核的深度也分为 G G G组,每组包含与输入特征图相同数量的通道,即每组有 D G \frac{D}{G} GD个卷积核。
  3. 独立卷积:对每组输入特征图和卷积核进行独立的卷积操作。每组内部的卷积操作与标准的卷积相同。
  4. 输出特征图拼接:将每组卷积操作的结果拼接起来,形成输出特征图。如果每组卷积操作后输出的特征图深度为 M M M,则最终输出特征图的深度为 G × M G \times M G×M

在这里插入图片描述

应用场景:

分组卷积在以下场景中特别有用:

  • 减少参数和计算量:分组卷积通过将输入特征图和卷积核分组,减少了每组的参数数量和计算量。这在设计轻量级网络或移动设备上的应用时非常有用。
  • 多路特征学习:分组卷积允许网络同时学习多个独立的特征表示,这有助于网络捕捉更丰富的特征。
  • 残差网络(ResNet):在残差网络中,分组卷积可以用来减少连接两个残差块之间的shortcut路径上的参数数量。

计算例子:

假设我们有一个输入特征图,其大小为 H × W × D H \times W \times D H×W×D,其中 D = 64 D = 64 D=64,我们想要应用一个 3 × 3 × 64 3 \times 3 \times 64 3×3×64的卷积核,但是使用分组卷积,将输入特征图和卷积核分为 G = 4 G = 4 G=4组。
每组包含 D G = 64 4 = 16 \frac{D}{G} = \frac{64}{4} = 16 GD=464=16个通道。因此,每组内的卷积操作是一个 3 × 3 × 16 3 \times 3 \times 16 3×3×16的卷积。
如果每组卷积操作后输出的特征图深度为 M M M,则最终输出特征图的深度为 G × M = 4 × M G \times M = 4 \times M G×M=4×M
分组卷积的参数数量为:
Params = k × k × D G × M × G = 3 × 3 × 16 × M × 4 \text{Params} = k \times k \times \frac{D}{G} \times M \times G = 3 \times 3 \times 16 \times M \times 4 Params=k×k×GD×M×G=3×3×16×M×4
这比标准卷积的参数数量 k × k × D × M k \times k \times D \times M k×k×D×M要少得多,其中 k k k是卷积核的大小。
分组卷积的一个典型例子是AlexNet,它是第一个在大规模图像识别竞赛中取得突破性成果的深度学习模型。AlexNet在网络的某些层使用了分组卷积,以减少计算量并允许更大的网络容量。

三、转置卷积的简述

转置卷积(Transposed Convolution),也称为反卷积(Deconvolution)或分数步长卷积(Fractionally Strided Convolution),是一种特殊的卷积形式,它用于在卷积神经网络(CNN)中上采样特征图。与常规卷积操作不同,常规卷积会通过滑动窗口和步幅来减小特征图的尺寸,转置卷积则可以增加特征图的尺寸。

转置卷积的基本操作:

  1. 填充和步幅:转置卷积首先对输入特征图进行填充(zero-padding),然后应用步幅(stride)大于1的卷积。这种操作使得输出特征图的尺寸大于输入特征图。
  2. 卷积核:转置卷积使用的卷积核与常规卷积相同,但是应用的方式不同。在转置卷积中,卷积核在输入特征图上的滑动方式使得输出特征图的尺寸增加。
  3. 上采样:通过填充和步幅的操作,转置卷积实现了上采样的效果,即将输入特征图的尺寸扩大。
    在这里插入图片描述

应用场景:

转置卷积在以下场景中特别有用:

  • 图像上采样:在生成图像或语义分割任务中,转置卷积用于将低分辨率图像上采样到高分辨率。
  • 特征图维度恢复:在卷积神经网络中,转置卷积可以用于在池化操作之后恢复特征图的尺寸。
  • 密集预测任务:在需要生成像素级预测的任务中,如语义分割,转置卷积用于将低维特征图映射到高维空间。

计算例子:

假设我们有一个 2 × 2 2 \times 2 2×2的输入特征图,我们想要通过转置卷积将其上采样到 4 × 4 4 \times 4 4×4的尺寸。我们可以使用一个 3 × 3 3 \times 3 3×3的卷积核,步幅为2,无填充( p = 0 p = 0 p=0)。
转置卷积的输出大小 O O O可以通过以下公式计算:
O = ( I − 1 ) × s − 2 p + k O = (I - 1) \times s - 2p + k O=(I1)×s2p+k
其中, I I I是输入特征图的尺寸, s s s是步幅, p p p是填充, k k k是卷积核的尺寸。
在我们的例子中,输入特征图的尺寸是 2 × 2 2 \times 2 2×2,步幅 s = 2 s = 2 s=2,填充 p = 0 p = 0 p=0,卷积核尺寸 k = 3 k = 3 k=3,所以输出特征图的尺寸是:
O = ( 2 − 1 ) × 2 − 2 × 0 + 3 = 4 O = (2 - 1) \times 2 - 2 \times 0 + 3 = 4 O=(21)×22×0+3=4
这意味着输出特征图的尺寸将是 4 × 4 4 \times 4 4×4
转置卷积的一个典型例子是在生成对抗网络(GANs)中,用于将低维特征向量转换为高分辨率的图像。在GANs的生成器部分,转置卷积用于逐步上采样特征图,最终生成与真实图像尺寸相同的合成图像。

四、空洞卷积的简述

空洞卷积(Dilated Convolution),也称为扩张卷积,是一种卷积操作的变体,它通过在卷积核之间插入“空洞”来增加感受野,而不增加参数数量或计算量。这种操作允许卷积层在保持相同参数数量的同时,覆盖更大的输入区域,从而捕捉更广泛的上下文信息。

空洞卷积的基本操作:

  1. 定义空洞率:空洞卷积通过一个称为“空洞率”(dilation rate)的参数来控制卷积核之间的间隔。空洞率定义了卷积核中的元素之间的间隔大小。例如,对于一个3x3的卷积核和空洞率2,卷积核的有效大小相当于5x5,但实际上只有9个参数。
  2. 应用卷积核:在应用卷积核时,根据空洞率在输入特征图上跳过一些像素。这相当于在卷积核之间插入“空洞”,从而在不增加参数数量的情况下增加感受野。
  3. 计算输出:除了跳过像素外,空洞卷积的计算方式与传统卷积相同。每个卷积核的元素与输入特征图上的相应元素相乘,然后将乘积求和得到输出特征图的一个元素。

应用场景:

空洞卷积在以下场景中特别有用:

  • 增加感受野:在保持计算成本不变的情况下,空洞卷积允许网络捕捉更广泛的上下文信息,这对于需要大感受野的任务(如语义分割)非常有用。
  • 保持分辨率:在传统的卷积神经网络中,多次卷积和池化操作会逐渐降低特征图的分辨率。空洞卷积可以在不降低分辨率的情况下增加感受野,这对于需要高分辨率输出的任务很有帮助。
  • 减少参数数量:对于资源受限的环境,如移动设备,空洞卷积提供了一种在不增加参数数量的情况下增加模型容量的方法。
  • 在这里插入图片描述

计算例子:

假设我们有一个 7 × 7 7 \times 7 7×7的输入特征图,我们想要应用一个 3 × 3 3 \times 3 3×3的卷积核,但使用空洞卷积,设置空洞率为2。
在标准卷积中, 3 × 3 3 \times 3 3×3卷积核会覆盖输入特征图上连续的 3 × 3 3 \times 3 3×3区域。但在空洞卷积中,由于空洞率为2,卷积核在输入特征图上的覆盖区域将变成 7 × 7 7 \times 7 7×7,但仍然只有9个参数。
空洞卷积的输出特征图大小 O O O可以通过以下公式计算:
O = I + 2 p − k − ( k − 1 ) × ( d − 1 ) s + 1 O = \frac{I + 2p - k - (k - 1) \times (d - 1)}{s} + 1 O=sI+2pk(k1)×(d1)+1
其中, I I I是输入特征图的尺寸, p p p是填充, k k k是卷积核的尺寸, d d d是空洞率, s s s是步幅。
在我们的例子中,输入特征图的尺寸是 7 × 7 7 \times 7 7×7,卷积核尺寸 k = 3 k = 3 k=3,空洞率 d = 2 d = 2 d=2,无填充( p = 0 p = 0 p=0),步幅 s = 1 s = 1 s=1,所以输出特征图的尺寸是:
O = 7 + 2 × 0 − 3 − ( 3 − 1 ) × ( 2 − 1 ) 1 + 1 = 5 O = \frac{7 + 2 \times 0 - 3 - (3 - 1) \times (2 - 1)}{1} + 1 = 5 O=17+2×03(31)×(21)+1=5
这意味着输出特征图的尺寸将是 5 × 5 5 \times 5 5×5
空洞卷积的一个典型例子是在DeepLab系列网络中,它是一种用于语义分割的卷积神经网络架构。DeepLab利用空洞卷积来增加感受野,从而能够捕捉到更大范围的上下文信息,提高分割的准确性。

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

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

相关文章

未能启动VMware Authorization Service

错误信息 英文版: VMware Workstation failed to start the VMware Authorization Service. You can try manuallystarting the VMware Authorization Service. If thisproblem persists, contact VMware support. 中文版 VMware Workstation 未能启动VMware Aut…

计算机体系结构与OS管理

冯诺依曼体系结构 我们只看数字信号(红色的线): 计算机数据的流动决定了计算机的效率,数据流动就是数据在不同地方的来回拷贝。 所以我们会采取让硬件设备直接与CPU链接的方式,所以就有了储存器了。储存器大大提升了效…

linux的SSH(远程登录)服务

目录 1.SSH远程管理 1.1 SSH的概述 1.2 OpenSSH服务器 1.3 SSH端口、配置文件 2.服务端重要配置 3.登录验证方式 3.1 密码验证 3.2 密钥对验证 4.使用 SSH 客户端程序 4.1 ssh 远程登录 4.2 scp 远程复制 4.3 sftp文件传输 5.创建使用密钥对 6.TCP Wrappers访问控…

B端管理系统不关注用户体验,绝对是不讲武德。

功能、颜值、体验是构成B端管理系统三个要素,如果仅强掉功能和颜值,对体验不够重视,系统出来必定功能堆砌,花哨的空架子,本文来分析一下为什么用户体验很重要。 一、B端管理系统三要素 功能 指的是B端系统提供的各种…

【Unity动画系统】动画状态基本属性与相关API、IK简单概述

动画状态基本属性与相关API Tag:判断是否当前播放着相对应Tag的动画,如果是,那么玩家的输入就是无效的。 using UnityEngine.InputSystem;public AnimatorStateInfo stateInfo;void State(){//stateInfo animator.GetCurrentAnimatorStateIn…

本地体验最强开源模型Llama3+Qnw(支持Windows和Mac)

一键运行大模型本地软件(含模型):点击下载 Meta放出Llama3模型了,也应该是这段时间里的一个科技大新闻了。 Llama一直都是开源大语言模型的领头羊驼。 而Llama3又是所有羊驼中最新的领头羊。 可以简单地来看一下官方的对比数据…

如何安全进行速卖通自养号测评操作?

对于新加入的卖家而言,进行销量测评显得尤为关键。速卖通平台上的新店往往难以获得活动的扶持,且初始流量相当有限。因此,开店的首要任务便是积极展开测评工作,努力积累初始的评论和销售记录。测评的益处颇为显著,它不…

【Linux系统编程】基本指令(一)

目录 1、ls指令 2、pwd指令 3、cd指令 4、touch指令 5、mkdir指令 6、rmdir指令与rm指令 7、man指令 8、cp指令 指令就像刚学windows时学的单击、双击一样,都是操作操作系统 在windows下,文件通常会放在文件夹中,而Linux中同样有文件…

Java设计模式 _创建型模式_原型模式(Cloneable)

一、原型模式 1、原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能比较好。一般对付出较大代价获取到的实体对象进行克隆操作,可以提升性能。 2、实现思路: (1)、需要克隆的…

python中怎么注释多行

多行代码注释 方法一:先选中要注释的段落,然后按下“ctrl/”,即可实现多行代码的注释。效果如下: 再一次按下“ctrl/”就可以取消注释。 方法二:跟注释单行一样在每一行前面输入“shift#”。 #r(i-arr[idx])*rat[idx]…

62、回溯-N皇后

思路: N皇后问题要求在一个nn的棋盘上放置n个皇后,使得它们不能相互攻击。皇后可以攻击同一行、同一列,以及两个对角线方向上的其他皇后。解决这个问题意味着找到所有可能的棋盘配置,每个配置都符合上述条件。 1、初始化数据结构…

【iconv】Linux c++ 中文字符串转十六进制 GBK 编码/内码

文章目录 问题描述c 代码CMakeLists.txt参考链接 问题描述 Linux 系统默认使用的是 UTF-8 编码,并且 c 中没有标准库可以直接将中文字符转为 GBK 编码/内码。因此需要借助 iconv 库来实现。 在实现代码之前,可以在一下在线工具网站进行中文字符到各个编…