卷积笔记0

首先整理普通的一维卷积、二维卷积和三维卷积。
一般来说,一维卷积应用于文本序列数据,二维卷积应用用图像,三维卷积应用于视频。
因此,一维卷积将代表一个文本序列的-【L,dim】形状的二维特征视为一个样本,其只能接受【L,dim】或[B,L,dim]的向量作为输入,其中最小粒度为[1,dim],代表一个文本序列中的一个单词。
二维卷积将代表一个图像的-[H,W,dim]形状的三维特征视为一个样本,其只能接受【H,W,,dim】或[B,H,W,dim]的向量作为输入,其中最小粒度为[1,1,dim],代表一个图片中的一个像素。
三维卷积将代表一个视频的-[T,H,W,dim]形状的四维特征视为一个样本,其只能接受【T,H,W,,dim】或[B,T,H,W,dim]的向量作为输入,其中最小粒度为[1,1,1,dim],代表着一个视频中的一个帧。

卷积的核心目的就是样本中不同粒度间信息的交互和融合,所以卷积核的向量形状,其中dim一定与样本dim一一致(保证将细小粒度的特征作为整体),而其他维度则可以是,对应样本中最小粒度,的倍数,对于一维卷积就是【x,dim】,对于二维卷积就是[x1,x2,dim],对于三维卷积就是[x1,x2,x3,dim].一般来说,卷积核的尺寸,是指向量维度中除了dim维度的其它向量形状(即x),因为dim固定,而且dim本来也是编码扩展出来的维度,可以看出,几维卷积是对于卷积核中尺寸(即x的个数)来说的,这也对应着积核可以移动的维度,也可以说卷积核的自由度。一维卷积只能朝着序列某个的方向移动,二维卷积则是朝着图片的两个维度,三维卷积则是视频的三个维度。

总的来说,卷积的作用就是将一个样本中,相邻的下一级别数据间信息进行融合的操作。不同维度的卷积就是处理的样本特征不同,特征间需要融合的相邻准则也不同。
卷积前 样本的特征维度dim_in决定着卷积核的特征维度dim_kerael,而卷积核的个数决定着样本被卷积后的特征维度dim out。而
卷积核的尺寸决定着特征融合的尺度,越大的尺寸会将样本融合成越小的形状。
在这里插入图片描述
需要注意的是
上图中有一些不正确的地方,三维卷积的图只是一个示意图,其卷积核其实是一个[x,y,z,dim]大小的四维向量,这里相当于是将dim设为1,并简化为[x,y,z]的三维向量。然后图中的蓝色3d data,其实应该是 [D,H,W ,1】 的4d data,但被图中简化成了 【,H,W ,D】的三维向量。

一维卷积

一维卷积示意图如下:
在这里插入图片描述
从平面图来看的话,一维卷积和二维卷积基本上是一致的,只是一维卷积核的宽宽必须固定为输入特征的宽度(即输入通道)

代码

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

Parameters
in_channels (int) – Number of channels in the input image
out_channels (int) – Number of channels produced by the convolution
kernel_size (int ) – Size of the convolving kernel
stride (int , optional) – Stride of the convolution. Default: 1
padding (int, optional) – Padding added to both sides of the input. Default: 0
padding_mode (str, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’
dilation (int , optional) – Spacing between kernel elements. Default: 1
groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1
bias (bool, optional) – If True, adds a learnable bias to the output. Default: True
padding=‘valid’ 与无填充相同。 padding=‘same’ 填充输入,以便输出具有与输入相同的形状。但是,此模式不支持除 1 之外的任何步幅值。

在torch中,一维卷积只能接受3维向量或者2维卷积,格式为 [Batch_Size,in_channels,len_text]或 [in_channels,len_text],经卷积后向量尺寸变为 [Batch_Size,out_channels,len_out]或 [out_channels,len_out]。其中,卷积后的序列长度由卷积核大小和padding以及stride 大小有关,公式为
在这里插入图片描述

out_channels则等于卷积核的个数。

二维卷积

二维卷积示意图如下:
在这里插入图片描述
可以看出,二维卷积核的深度与输入数据的深度一致,但是宽度不用一致,这就是相较于一维卷积和三维卷积的差别。由于尺寸的关系,因此二维卷积可以在宽和长两个维度上移动。

代码

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)

Parameters
可以看出,与一维卷积代码参数相同。不过
参数 kernel_size、stride、padding、dilation 可以是:
单个 int – 在这种情况下,高度和宽度维度使用相同的值
两个 int 的元组 – 在这种情况下,第一个 int 用于高度维度,第二个 int 用于宽度维度

在torch中,二维卷积只能接受4维向量或者3维向量,而且格式为 [Batch_Size,in_channels,H,W]或[in_channels,H,W],经卷积后向量尺寸变为 [Batch_Size,out_channels,Hout, Wout]或[out_channels,Hout, Wout]。其中,卷积后的图片宽高由卷积核大小和padding以及stride 大小有关,公式为
在这里插入图片描述
out_channels则等于卷积核的个数。如下图所示:
在这里插入图片描述

三维卷积

三维卷积是在二维卷积上的扩展,可以简化为二维卷积的方式来直观的表示,如下图所示:

在这里插入图片描述
其卷积核其实是一个[x,y,z,dim]大小的四维向量,这里相当于是将dim设为1,并简化为[x,y,z]的三维向量。然后图中的蓝色3d data,其实应该是 [D,H,W ,1】 的4d data,但被图中简化成了 【,H,W ,D】的三维向量。

代码

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

Parameters
可以看出,与一维卷积代码参数相同。类似二维卷积,参数 kernel_size、stride、padding、dilation可以是整数或者三元元组。

在torch中,三维卷积只能接受5维向量或者4维向量,而且格式为 [Batch_Size,in_channels,D,H,W]或[in_channels,D,H,W],经卷积后向量尺寸变为 [Batch_Size,out_channels,Dout,Hout, Wout]或 [out_channels,Dout,Hout, Wout]。其中,卷积后的图片宽高由卷积核大小和padding以及stride 大小有关,公式为

在这里插入图片描述

out_channels则等于卷积核的个数。

特殊卷积

反卷积

在这里插入图片描述
反卷积,也称为转置卷积,其核心思想就是逆运算卷积过程,根据卷积核和卷积输出结果,推算卷积输入。严格按照公式的话,是需要进行逆运算的,但是我们在pytorch中,只是作为一种扩展特征大小的,一种上采样的方式,其中的卷积核是学习得到的。

原理

卷积的操作,在pytorch中是通过矩阵相乘实现的,用公式可表示为
在这里插入图片描述
通过矩阵运算法则,可根据Y 和 C 来计算 X ,即
在这里插入图片描述
这就是反卷积,通过上面公式也可以看出,原理上来说,是需要将卷积核进行转置,这就是反卷积被成为转置卷积的原因。

代码

代码是以二维反卷积为示例的,一维和三维的与此相似。

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

Parameters
in_channels (int) – Number of channels in the input image
out_channels (int) – Number of channels produced by the convolution
kernel_size (int or tuple) – Size of the convolving kernel
stride (int or tuple, optional) – Stride of the convolution. Default: 1
padding (int or tuple, optional) – dilation * (kernel_size - 1) - padding zero-padding will be added to both sides of each dimension in the input. Default: 0
output_padding (int or tuple, optional) – Additional size added to one side of each dimension in the output shape. Default: 0
groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1
bias (bool, optional) – If True, adds a learnable bias to the output. Default: True
dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1

可以看出,反卷积的参数和操作基本上和一般卷积没有区别。但是向量形状变化相反,如下图所示
在这里插入图片描述在这里插入图片描述

作用

反卷积是一种重要的图像上采样技术,能够将特征图(feature map)的尺寸扩大,从而恢复或近似重构输入图像的尺寸和细节。

优点

  1. 反卷积通过调整卷积核、步长和填充等参数,可以灵活地控制输出特征图的尺寸和形状,满足不同的上采样需求。
  2. 反卷积可以无缝集成到现有的卷积神经网络架构中,用于构建端到端的上采样-下采样网络,提高了网络的整体性能和效率
  3. 与传统的插值方法相比,反卷积通过参数学习实现上采样,能够更好地保留图像的特征信息,并恢复更多的细节。这种基于参数学习的方法通常比简单的插值方法效果更好

缺点

在使用反卷积进行图像上采样时,常常会出现棋盘效应(Checkerboard Artifacts),即生成的图像中会出现明显的棋盘格状伪影。这主要是由于反卷积过程中重叠区域的不均匀性导致的

分组卷积

分组卷积就是将特征图平均分为N组,然后每组内部进行正常卷积,然后N组得到的特征图按照通道维度进行拼接,得到输出。
如下图所示:

在这里插入图片描述
卷积核被分成前后两个组(在实际中两组卷积核权重一致,从而可以减少参数量),前半部分的卷积组负责处理前半部分的输入层,后半部分的卷积组负责处理后半部分的输入层,最后将结果合并组合。

代码

分组卷积的代码其实就是正常卷积的代码,只要对groups参数进行设计就可。

优点

参数量减少:‌分组卷积的参数量是正常卷积的1/N,‌其中N为分组数。‌这是因为将卷积操作分成多个独立的组进行,‌每个组处理一部分输入数据,‌从而减少了参数数量。‌
稀疏结构:‌分组卷积可以视为正常卷积的一种稀疏结构,‌这种稀疏性可以看作是一种正则化方法,‌有助于防止过拟合。‌
类似Dropout的效果:‌分组卷积在某种程度上具有与Dropout类似的效果,‌通过减少通道间的信息交互,‌增加模型的泛化能力。‌

缺点

信息交互减少:‌由于分组卷积将输入数据分成不同的组进行处理,‌组与组之间的信息交互减少,‌可能导致模型在某些情况下无法充分利用全部的数据信息。‌
信息屏蔽和阻塞:‌通道之间的信息没有交互,‌存在信息的屏蔽和阻塞,‌这可能会导致模型在某些情况下无法有效地学习和利用通道间的关系

组卷积改进版-交错式组卷积

在这里插入图片描述
如上图所示,交错式组卷积就是结合通道重排列和组卷积,可以在一定程度上保持组卷积优点的同时,还能消除原有组卷积的缺点,能够将输入中的每个特征通道都能与输出中的每个特征通道相连接。

原理

交错组卷积主要分为主组卷积和次组卷积两部分,其中:
主组卷积将输入特征分成L个组,每组包含M个特征通道,进行分组特征提取。主分组卷积的输入来自于直接分割图像的通道,如图绿和黄两个主分区:L=2,M=3。它相当于标准的分组卷积,沿通道分成L组,每个组内包括M个特征通道,使用卷积核进行空间卷积,用来处理空间相关性。

次组卷积则负责对主组卷积不同组的输出进行融合,将特征看作包含L个通道的M个组,每个组内的每一通道特征来自主组卷积的不同组。如图主分区又依照通道数分三个次分区,每个次分区融合有主组卷积两个主分区的特征。相当于经过通道打乱的组卷积,沿通道分成M组,每个组内包括L个特征通道,为了把主组卷积结果的不同通道混合,使用1*1的卷积核进行逐点卷积,最后再恢复打乱的通道顺序,卷积完全是空间域的。

交错组卷积前后使用了两个排序模块,相当于通道打乱操作及其逆操作。如第一次为打乱通道,第二次为重新排序。

空洞卷积

空洞卷积也称为膨胀卷积,其操作就是在卷积核里面的元素之间插入空格来“膨胀”内核,并用膨胀率参数L表示要扩大内核的范围,即在内核元素之间插入L-1个空格。当L=1时,则内核元素之间没有插入空格,变为标准卷积。
如下图所示,其实图a代表普通卷积,图b代表L=2时的空洞卷积,图c则代表L=4。
在这里插入图片描述

代码

空洞卷积的代码其实就是正常卷积的代码,只要对dilation参数进行设计就可。

优缺点

空洞卷积的优点就是在不增加参数量和计算量的情况下,增加模型的感受野,对于类似于语义分割等需要全局上下文信息的任务相当有用。缺点就是当空洞率较大时,空洞卷积容易产生网格效应(Grid Effect),即卷积核只能访问到规则间隔的像素,可能导致感受野内的信息不足,影响特征提取效果。

可分离卷积

可分离卷积是指将普通的卷积操作,转换为由小卷积核组成的多个小卷积,达到与原有卷积操作相同功能。可分为空间可分离卷积(Spatially Separable Convolutions)和深度可分离卷积(Depthwise Separable Convolutions)。 两者的原理是一致的,即一个矩阵可以分为多个小矩阵的乘积,例如33的矩阵可分为31和1*3的的小矩阵的相乘,而小矩阵的相乘可以大大降低计算量。
在这里插入图片描述

空间可分离卷积

在这里插入图片描述
如上图所示,空间可分离卷积主要是针对图像的 2D 空间维度,即高和宽。其原理就是将一个卷积分解为两个单独的运算。对于上面的示例,3×3 的 Sobel 核被分成了一个 3×1 核和一个 1×3 核。

深度可分离卷积

深度可分离卷积也是将普通卷积操作分为两步,不过针对的是图像的3D空间维度,这两步操作被称为Depthwise Convolution与Pointwise Convolution,一个负责对每个通道内的所有特征进行卷积,另一个负责对所有通道内同一个位置的特征进行卷积。示意图如下:

在这里插入图片描述
上图为Depthwise Convolution,与常规卷积不同,类似于分组数等于通道数的分组卷积,,其中一个卷积核负责一个通道,一个通道只被一个卷积核卷积,有多少个通道就需要多少个卷积核。
在这里插入图片描述
上图为 Pointwise Convolution,可以看出Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。
在这里插入图片描述
重复多次1x1的卷积操作(如上图为128次),则最后便会得到一个深度的卷积结果、

优缺点

可分离卷积的优点明显,就是可以大大 降低计算量,而且在许多模型中还能不降低模型的准确性。缺点就是结构复杂,需要很好的设计才能保证模型具有较好的性能。

代码实现

深度可分离卷积中的第一步通过将组卷积中分组数设置为通道数就可以实现,而第二步通过卷积核为11M大小的普通卷积就可以实现。

self.conv = nn.Sequential(
    # 3x3 depthwise convolution
    nn.Conv2d(hidden_dim, hidden_dim, kernel_size=3, stride=stride, padding=1, groups=hidden_dim, bias=False),
    nn.BatchNorm2d(hidden_dim),
    nn.ReLU6(inplace=True),

    # 1x1 pointwise convolution (compress)
    nn.Conv2d(hidden_dim, out_channels, kernel_size=1, stride=1, padding=0, bias=False),
    nn.BatchNorm2d(out_channels),
)

可变形卷积

在这里插入图片描述
传统的卷积操作是将特征图分成一个个与卷积核大小相同的部分,然后进行卷积操作,每部分在特征图上的位置都是固定的。但其实对于形变比较复杂的物体,使用这种卷积的效果可能并不好。可变形卷积的提出则很好的解决了该问题,通过在每一个卷积核位置上附加一个对应的偏移量,能让模型在卷积过程中,对不同形状的物体进行卷积,如上图中的b、c、d所示,可以实现对原有物体变形、缩放和旋转等操作后形成物体的卷积。

原理

在这里插入图片描述

传统的卷积结构可以定义成公式1,其中是输出特征图的每个点,与卷积核中心点对应,pn是p0在卷积核范围内的每个偏移量。
在这里插入图片描述
而可变形卷积则在上述公式1的基础上为每个点引入了一个偏移量,偏移量是由输入特征图与另一个卷积生成的,通常是小数。

在这里插入图片描述
最终示意图如上,先通过一个卷积(对应绿色部分)获取每个位置的偏移量,然后将这些偏移量加到真正卷积中(对应蓝色部分),实现对图像的可变性卷积。

优缺点

可变形卷积通过在卷积操作中引入偏移量,使得卷积核可以适应图像中的复杂几何结构,增强了卷积核对不同形状和结构的适应能力。而且由于卷积核不再局限于固定的位置,可变形卷积能够更有效地提取不规则形状和结构的特征,提升了模型在复杂场景下的表现。

其缺点则为可变形卷积引入了额外的偏移量参数,这些参数需要在训练过程中进行学习,增加了计算复杂度和内存占用,同时引入额外的自由度(偏移量参数)可能导致模型更容易过拟合,特别是在训练数据不足或数据噪声较大的情况下。

根据引用,这篇笔记是关于卷积神经网络(CNN)的深度学习理论详解和项目实战的学习笔记。这篇笔记主要介绍了CNN在计算机视觉和图像识别中的应用。 根据引用,在CNN中,Co代表输出通道数(也称为卷积核数量),Ci代表输入通道数,Kh代表卷积核的高度,Kw代表卷积核的宽度。这些参数可以用来定义CNN的结构。 根据引用,你提到想要使用R语言实现一维CNN,并输入一些变量进行二分类。你可以按照想要的数据进行二分类,然后使用R语言编写代码来实现CNN,并添加损失函数的曲线。 希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [深度学习卷积神经网络(CNN)全笔记,附代码](https://blog.csdn.net/weixin_58176527/article/details/125530000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [深度学习——CNN卷积神经网络个人理解笔记汇总](https://blog.csdn.net/m0_59998867/article/details/123696930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [语言实现一维CNN吗,想输入些变量实现二分类 就是有一些变量,想输入到cnn里算一下进行二分类,这个是想做...](https://download.csdn.net/download/Mrrunsen/88267034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值