深入理解卷积(机器学习,深度学习,神经网络)
深入理解卷积(机器学习,深度学习,神经网络)
========================================
https://zhuanlan.zhihu.com/p/611815827?utm_id=0
卷积 (Convolution)
当给定一张新图时,CNN 并不能准确地知道这些特征到底要匹配原图的哪些部分,所以它会在原图中把每一个可能的位置都进行尝试,相当于把这个 feature(特征)变成了一个过滤器。这个用来匹配的过程就被称为卷积操作,这也是卷积神经网络名字的由来。
卷积的操作如下图所示:
如果两个像素点都是白色(值均为 1),那么 1*1 = 1,如果均为黑色,那么 (-1)*(-1) = 1,也就是说,每一对能够匹配上的像素,其相乘结果为 1。类似地,任何不匹配的像素相乘结果为 - 1。具体过程如下(第一个、第二个……、最后一个像素的匹配结果):
根据卷积的计算方式,第一块特征匹配后的卷积计算如下,结果为 1
对于其它位置的匹配,也是类似(例如中间部分的匹配)
计算之后的卷积如下
以此类推,对三个特征图像不断地重复着上述过程,通过每一个
feature(特征)的卷积操作,会得到一个新的二维数组,称之为 feature map。其中的值,越接近 1 表示对应位置和 feature
的匹配越完整,越是接近 - 1,表示对应位置和 feature 的反面匹配越完整,而值接近 0
的表示对应位置没有任何匹配或者说没有什么关联。如下图所示:
可以看出,当图像尺寸增大时,其内部的加法、乘法和除法操作的次数会增加得很快,每一个 filter 的大小和 filter 的数目呈线性增长。由于有这么多因素的影响,很容易使得计算量变得相当庞大。
========================================
https://www.zhihu.com/question/22298352/answer/2361119454
========================================https://zhuanlan.zhihu.com/p/30994790
傅里叶变换、拉普拉斯变换、自(互)相关及卷积是线性系统分析里面最重要的四个数学工具,可以毫不夸张的说,自动控制、信号处理等课程几乎所有内容都是这几个公式组合排列的结果。
首先我们先来回顾一下卷积公式:
它的物理意义大概可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果。
放在图像分析里,f(x) 可以理解为原始像素点(source pixel),所有的原始像素点叠加起来,就是原始图了。
g(x)可以称为作用点,所有作用点合起来我们称为卷积核(Convolution kernel)
卷积核上所有作用点依次作用于原始像素点后(即乘起来),线性叠加的输出结果,即是最终卷积的输出,也是我们想要的结果,我们称为destination pixel.
我们来看看一张图,你就懂了:
最左边呢就是我们原始输入图像了,中间呢是卷积核,-8就是卷积的结果。
同样提取某个特征,经过不同卷积核卷积后效果也不一样(这是个重点,为什么说重点,因为CNN里面卷积核的大小就是有讲究的)。
(1)原始图像通过与卷积核的数学运算,可以提取出图像的某些指定特征(features)。
(2)不同卷积核,提取的特征也是不一样的。
(3)提取的特征一样,不同的卷积核,效果也不一样。
========================================
https://zhuanlan.zhihu.com/p/100289337
- 统计学中,加权的滑动平均是一种卷积。
- 概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。
- 声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。
- 电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得
- 物理学中,任何一个线性系统(符合叠加原理)都存在卷积。
- 计算机科学中,卷积神经网络(CNN)是深度学习算法中的一种,近年来被广泛用到模式识别、图像处理等领域中。
========================================
https://baijiahao.baidu.com/s?id=1763918774142180931&wfr=spider&for=pc
三、卷积核的设计
卷积核的设计是卷积神经网络中的重要问题,好的卷积核可以提取出更加有效的特征,从而提高网络的性能。卷积核的设计可以从以下几个方面入手:
1. 大小
卷积核的大小通常是奇数,例如3x3、5x5、7x7等。较小的卷积核可以提取出更加局部的特征,而较大的卷积核可以提取出更加全局的特征。通常情况下,使用多个不同大小的卷积核可以提高网络的性能。
2. 数量
卷积核的数量通常是网络的超参数,需要进行调节。较少的卷积核可以减少网络的参数数量,降低过拟合的风险,但可能会降低网络的性能。较多的卷积核可以提高网络的性能,但可能会增加网络的计算量和内存消耗。
3. 初始化
卷积核的初始化可以影响网络的训练效果。通常情况下,卷积核的初始化可以采用随机初始化、Xavier初始化、He初始化等方法。随机初始化可以使卷积核具有一定的随机性,但可能会导致网络的收敛速度较慢。Xavier初始化可以使卷积核的输出具有相同的方差,从而加速网络的收敛速度。He初始化可以使卷积核的输出具有较大的方差,从而提高网络的性能。
========================================
本文中,作者系统的探索了大卷积核的效果:
在 CNN 中使用的 depth-wise 卷积,卷积核大小从 3 × 3 → 31 × 31
这种简单增加卷积核大小的操作是很有效的,也能很好的和 ViT 的机理契合
链接:https://blog.csdn.net/jiaoyangwm/article/details/123532630
使用少量大卷积核而非大量小卷积核,能够有效的提升有效感受野,提高 CNN 的效果。所以作者建议研究更好的有效感受野来提升效果。并且,大卷积核既然能够取得类似好的成绩,那么也可以被用来理解 self-attention 的内在机理。
========================================
https://cloud.tencent.com/developer/article/1438010
一、卷积与互相关
在信号处理、图像处理和其它工程/科学领域,卷积都是一种使用广泛的技术。在深度学习领域,卷积神经网络(CNN)这种模型架构就得名于这种技术。但是,深度学习领域的卷积本质上是信号/图像处理领域内的互相关(cross-correlation)。这两种操作之间存在细微的差别。
无需太过深入细节,我们就能看到这个差别。在信号/图像处理领域,卷积的定义是:
其定义是两个函数中一个函数经过反转和位移后再相乘得到的积的积分。下面的可视化展示了这一思想:
信号处理中的卷积。过滤器 g 经过反转,然后再沿水平轴滑动。在每一个位置,我们都计算 f 和反转后的 g 之间相交区域的面积。这个相交区域的面积就是特定位置出的卷积值。
这里,函数 g 是过滤器。它被反转后再沿水平轴滑动。在每一个位置,我们都计算 f 和反转后的 g 之间相交区域的面积。这个相交区域的面积就是特定位置出的卷积值。
另一方面,互相关是两个函数之间的滑动点积或滑动内积。互相关中的过滤器不经过反转,而是直接滑过函数 f。f 与 g 之间的交叉区域即是互相关。下图展示了卷积与互相关之间的差异。
信号处理中卷积与互相关之间的差异
在深度学习中,卷积中的过滤器不经过反转。严格来说,这是互相关。我们本质上是执行逐元素乘法和加法。但在深度学习中,直接将其称之为卷积更加方便。这没什么问题,因为过滤器的权重是在训练阶段学习到的。如果上面例子中的反转函数 g 是正确的函数,那么经过训练后,学习得到的过滤器看起来就会像是反转后的函数 g。因此,在训练之前,没必要像在真正的卷积中那样首先反转过滤器。
========================================
http://www.360doc.com/content/22/0509/12/13826502_1030471576.shtml
卷积核大小:卷积核定义了卷积的大小范围,在网络中代表感受野的大小,二维卷积核最常见的就是 3*3 的卷积核。一般情况下,卷积核越大,感受野越大,看到的图片信息越多,所获得的全局特征越好。但大的卷积核会导致计算量的暴增,计算性能也会降低。
步长:卷积核的步长代表提取的精度, 步长定义了当卷积核在图像上面进行卷积操作的时候,每次卷积跨越的长度。对于size为2的卷积核,如果step为1,那么相邻步感受野之间就会有重复区域;如果step为2,那么相邻感受野不会重复,也不会有覆盖不到的地方;如果step为3,那么相邻步感受野之间会有一道大小为1颗像素的缝隙,从某种程度来说,这样就遗漏了原图的信息。
填充:卷积核与图像尺寸不匹配,会造成了卷积后的图片和卷积前的图片尺寸不一致,为了避免这种情况,需要先对原始图片做边界填充处理。
========================================
https://blog.csdn.net/qq_42414972/article/details/118416422
(1)Kernel_size是如何选取的?
Q: 为什么CNN中的卷积核一般都是奇数*奇数 ?
A: 原因有二。
(1) 卷积中有一种same convolution,也就是卷积前后尺寸(高x宽)不变。实现same convolution(n + padding - k + 1 = n) 。若 k 为偶数,那么padding就为奇数,就不能平均分配到卷积张量两边。
(2)此外,奇数尺寸的卷积核便于用中心定位。
达到相同感受野的情况下,卷积核越小,所需要的参数和计算量越小。所以2×2排除了,一般都用3×3作为卷积核的大小。1×1的卷积核不能提升感受野,不能应用在需要提升感受野的应用中,也排除了。
(2)Channel数如何选取?
这与特征层的大小及能抽象出来的特征数量有关,特征层池化压缩后越小,图片的潜在的东西越复杂,所需要的深度或通道数越多。 极端情况下,假设一个通道只放一个特征例如嘴的特征,那这个图如果为了做一定性能的脸部识别,有千多个特征,那深度可能要一千多个了;幸好一个通道可以不用池化压缩得太小,一个通道放多个特征也能满足卷积的要求。
样本的丰富程度较好的情况下,模型的复杂度可以更高,那核内深度就可以更大,拟合、分类容易做到更准确。但速度上与硬件要求上就可能不行了。一般是能达到性能要求就行,要综合考虑。
之所以搞卷积而非全连接,就是减少参数量,就是准确性性能与速度、资源占用的综合考虑的结果。 综合考虑选取channel数量。既要保证准确度(个数越多越好),又要兼顾算力问题(个数越少越好)。
每一层卷积有多少channel数,以及一共有多少层卷积,这些暂时没有理论支撑,一般都是靠感觉去设置几组候选值,然后通过实验挑选出其中的最佳值。trial and error。 这也是现在深度卷积神经网络虽然效果拔群,但是一直为人诟病的原因之一。
(3)卷积层数如何选取 ?
多说几句,每一层卷积的channel数和网络的总卷积层数,构成了一个巨大的超参集合,这个超参集合里的最优组合,很可能比目前业界各种fancy的结构还要高效。只是我们一来没有理论去求解这个超参集合里的最优,二来没有足够的计算资源去穷举这个超参集合里的每一个组合,因此我们不知道这个超参集合里的最优组合是啥。现在业界里提出的各种fancy结构中不少都是不断trial and error,试出来一个效果不错的网络结构,然后讲一个好听的story,因为深度学习理论还不够,所以story一般都是看上去很美,背后到底是不是这回事只有天知道。比如好用到不行的batch norm,它的story是解决internal covariate shift,然而最近有篇文章How Does Batch Normalization Help Optimization? (No, It Is Not About Internal Covariate Shift)通过实验证明实际情况并不如此。
链接:https://www.zhihu.com/question/38098038/answer/416069216
总结:
卷积核大小、个数,卷积层数,都是先根据以往的经验设定一个初始值,然后根据具体的实验效果进行微调。
原文链接:https://blog.csdn.net/qq_42414972/article/details/118416422
========================================
https://zhuanlan.zhihu.com/p/91041838
卷积核的大小一般都是3*3,5*5,7*7这样的奇数大小,这是为什么呢?其实很简单,主要有以下两个原因:
(1)奇数卷积核更容易做padding。我们假设卷积核大小为k*k,为了让卷积后的图像大小与原图一样大,根据公式可得到padding=(k-1)/2,看到这里,细心地小伙伴应该已经看到点端倪了,没错,这里的k只有在取奇数的时候,padding才能是整数,否则padding不好进行图片填充;
(2)更容易找到锚点。这又是什么意思呢?在CNN中,一般会以卷积核的某个基准点进行窗口滑动,通常这个基准点是卷积核的中心点,所以如果k'是偶数,就找不到中心点了。
========================================
这里我们讨论具有提升感受野的卷积,不讨论1×1的卷积。
在达到相同感受野的情况下,卷积核越小,所需要的参数和计算量越小。
具体来说。卷积核大小必须大于1才有提升感受野的作用,1排除了。而大小为偶数的卷积核即使对称地加padding也不能保证输入feature map尺寸和输出feature map尺寸不变(画个图算一下就可以发现),2排除了。所以一般都用3作为卷积核大小。
每一层卷积有多少channel数,以及一共有多少层卷积,这些暂时没有理论支撑,一般都是靠感觉去设置几组候选值,然后通过实验挑选出其中的最佳值。这也是现在深度卷积神经网络虽然效果拔群,但是一直为人诟病的原因之一。
多说几句,每一层卷积的channel数和网络的总卷积层数,构成了一个巨大的超参集合,这个超参集合里的最优组合,很可能比目前业界各种fancy的结构还要高效。只是我们一来没有理论去求解这个超参集合里的最优,二来没有足够的计算资源去穷举这个超参集合里的每一个组合,因此我们不知道这个超参集合里的最优组合是啥。
现在业界里提出的各种fancy结构中不少都是不断trial and error,试出来一个效果不错的网络结构,然后讲一个好听的story,因为深度学习理论还不够,所以story一般都是看上去很美,背后到底是不是这回事只有天知道。比如好用到不行的batch norm,它的story是解决internal covariate shift,然而最近有篇文章How Does Batch Normalization Help Optimization? (No, It Is Not About Internal Covariate Shift)通过实验证明实际情况并不如此。
推荐一篇讲如何设计CNN网络的文章A practical theory for designing very deep convolutional neural networks。
========================================
https://www.zhihu.com/question/38098038
首先要明确,对于一个执行分类任务的卷积神经网络,通常可以分为两个部分,前半部分以卷积层为主,兼带有降采样的池化层,在比较复杂的CNN中,可能还会存在Batch normalization、channel shuffle等操作,该部分的主要功能是提取图片的特征。而后半部分则是一个或多个全连接层,可以把它看成一个分类器。所以用于分类的CNN,本质是一个特征提取器
+分类器的组合。如果你高兴的话,也可以用PCA等方法提取特征,或用SVM等方法进行分类。
关于如何确定CNN中的卷积核大小、卷积层数以及每层feature map个数,目前还没有一个理论性很强的解释,更多的是在根据已有的经验设计,或者利用自动搜索的方法搜索出较为合适的取值。但这其中也有一些比较普适的准则,下面进行一个简单的讨论。
1. 卷积核大小
理论上来说,卷积核的大小可以是任意的,但绝大部分的CNN中使用的卷积核都是奇数大小的正方形,原因请参考
龙鹏-言有三:【AI-1000问】为什么CNN中的卷积核一般都是奇数*奇数?
在Inceptionv3中曾经提出了使用1*3+3*1的非对称卷积核,但是并没有得到很广泛的使用。
AlexNet中使用了11*11的大卷积核,但此后再无网络使用大于7*7的卷积核。在VGGNet中指出,两个3*3的卷积核拥有和1个5*5的卷积核相同的感受野,如下图所示:
而且这样做还有以下两个优点:
①参数量更小,在卷积核数量都为n时,1个5x5的卷积层中的参数量为25n,而2个3x3的卷积层中的参数量为18n。
②2个3x3的卷积层拥有比1个5x5的卷积层更多的非线性变换(前者可以使用两次非线性激活函数,而后者只有一次),使得 CNN 对特征的学习能力更强。
在VGGNet之后,3*3的小卷积核成为了设计网络的主流。在通用的神经网络中,大多是先使用一个7*7的大卷积,之后采用3*3卷积堆叠(ResNet,DenseNet),而在轻量化的神经网络中,则大多全部采用3*3的卷积(MobileNetv1,v2,ShuffleNet系列)。
看起来3*3的卷积已经成为了大势所趋,但是自动搜索技术被提出来之后,情况又出现了新的变化。下面是几个使用自动搜索技术得到的网络的结构:
NAS:
FH为卷积核的高度,FW为卷积核的宽度
NasNet:
PNasNet:
MobileNetv3-Large:
MobileNetv3-Small:
可以看到,5*5、7*7的卷积又重新回到了大家的视野,尤其是NAS中还出现了3*7这样的长方形卷积。手工设计的结构,大多是非常规整、具有层次感的结构(典型例子:ResNeXt),而自动搜索的结出的结构往往是比较“杂乱无章”的。我个人认为在网络中使用不同种类、不同大小的卷积核,尤其是在非串联结构中,大概率会取得更好的效果。而这一思想早在GoogLeNet中就有体现。
2. 卷积层数
深度学习为何被称作深度学习? 就是因为网络层数深。早期(2012~2016年)最为经典的几个CNN,AlexNet、VGGNet、GoogleNet、ResNet,网络层数是在不断加深的,Batch normalization和残差结构的出现解决了以前深层网络容易出现梯度消失、难以训练的问题,使得网络的深度可以加到非常深。理论上说,较深的CNN不会比较浅的CNN效果差(ResNet中提到),但是边际效应在此处是显然存在的,目前来说轻量化的神经网络的层数一般在几十层左右,而较大的神经网络也很少有超过200层的。
3. feature map个数
关于feature map的个数,有一个大部分网络都在遵循的原则就是当输出特征图尺寸减半时,输出特征图的通道数应该加倍,这样保证相邻卷积层所包含的信息量不会相差太大(我记得该想法出自Inceptionv3,但记不太清了,麻烦有知道的朋友告诉我一下)。
至于全连接层的节点数,首先现有的分类网络的最后一层几乎都是使用softmax函数激活,输出图片属于每一个类别的概率值,所以最后一层的节点数等于待分类图片的类别数,这是毋庸置疑的。而在Network in network提出全局平均池化(GAP)后,主流的网络几乎都是在特征图尺寸降低到7*7左右时,直接GAP+全连接+softmax输出分类概率。这样网络中只有一层全连接层,其输入节点数是GAP之前的特征图个数,输出节点数是图片分类类别数目。
总结:
关于CNN中的卷积核大小、卷积层数以及每层feature map个数,目前已经提出了一些基于经验的直观准则,还有一些约定俗称的默认设置,但是目前为止对此方面还没有一个理论严密且令人信服的解释。而未来的趋势可能是直接利用自动搜索技术对网络的结构参数进行搜索,这样得到的结果虽然仍然无法用理论严密地解释,但至少是令人信服的。
-----2019.09.30 更新-----
关于卷积核的大小,补充两点我近期看到的内容:
(1)前文中已经提到,在自动搜索技术出现了以后,3*3的卷积核不再是网络唯一的选择,5*5和7*7的大卷积核又重新回到了人们的视野中,那么卷积核尺寸是不是越大越好呢?MixNet中,作者对这一问题进行了讨论,作者将mobilenet v1/v2中的卷积核全部换成大卷积核,并比较了它们的性能,结果如下图所示:
结果发现,当卷积核大小为5*5或7*7时,增大卷积核的尺寸会提升网络的性能(显然这是以计算量的增加为代价的),而当卷积核大小大于9*9时,更大的计算量,反而会导致更差的网络性能。 作者认为原因是过大的卷积核尺寸不利于提取图像的局部特征(极端的例子是:如果卷积核的大小与图像大小相等,那么网络就变成全连接神经网络了)。 手工设计的神经网络,除了AlexNet以外,没有大于7*7的卷积核,而自动搜索的神经网络,大部分在搜索网络结构时,也是把卷积核大小限定为3*3/5*5/7*7,同样没有把大于7*7的卷积核纳入到搜索空间中。这与MixNet中的结论不谋而合。
(2)在ProxylessNAS中,作者发现:降采样层的卷积核大小相对较大,作者认为大的卷积核有利于在降采样时保留更多的信息。
========================================
为什么CNN中的卷积核一般都是正方形,没有长方形?
https://www.zhihu.com/question/265600103
========================================
https://www.cnblogs.com/AntonioSu/p/11958523.html
作用:
也可以称作为滤波器,是消除噪声(在图像上是指引起较强视觉效果的孤立像素点或像素块),提取主要研究对象。
优点:
参数共享
利用BP自动学习权重特征
缺点:
需要大量的有监督数据
特征:
较浅的卷积层感受野较小,学习到一些局部区域的特征。较深的卷积层具有较大的感受野,能够学习到更加抽象一些的特征(图像更加精华的内容)。
具有平移不变性( translation invariance)
图像的大小不影响卷积。
经过多次卷积(包括pooling)以后,得到的图像越来越小,分辨率越来越低(粗略的图像)
按照卷积核的功用
其中可分为两种类型,一种是参数值可学习,另一种是参数值不可学习。
1.可学习的卷积核
1)普通卷积核,随机初始化,具体参数值可通过bp学习
2)高斯卷积核,通过bp学习均值和方差
对整幅图像进行加权平均操作的过程。适用于使图片产生模糊(可以理解成每一个像素都取周边像素的平均值)的效果。
卷积核的权重总值等于1。否则的话,使用总值大于1的滤镜会让图像偏亮,小于1的滤镜会让图像偏暗。
2.不可学习的卷积核
1)均值核,去除椒盐噪声(所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素)。
2)空卷积核,只有中心为1,其它都为0,相对于什么也没有做。
按照卷积核的卷积方式
1.反卷积(Deconvolution)
虽然下采样(downsample),就是pooling不可逆,但是借用反卷积可以做一定程度的还原。
反卷积就是上采样(upsample),其中包括有转置卷积、空洞卷积(Dilated convolution)
1)空洞卷积
作用:通过空洞卷积可以在保持卷积核参数大小不变的同时,增大卷积的视野。
借用论文中的图
(a)是普通的卷积,对应的卷积核是3x3,1-dilated convolution
(b)对应的是3x3的卷积核,2-dilated convolution;相对于7x7的卷积核,1-dilated convolution对应的感受野
(c)对应的是3x3的卷积核,4-dilated convolution;相对于15x15的卷积核,1-dilated convolution对应的感受野
对于空洞部分补0或者是双线性插值。
原论文:https://arxiv.org/pdf/1511.07122v2.pdf
2)转置卷积
转置卷积只能还原shape大小,而不能还原value。
具体操作如下:
2.可变性卷积(Deformable Convolutional Network)
卷积核中的每个值均对应一个偏置,达到了卷积不是固定方格的效果,参数量是普通的卷积核的两倍(多出来的部分是记录偏置)。
代码参考: https://github.com/msracver/Deformable-ConvNets
按照功用分类可参考博客:https://www.jianshu.com/p/8d2d93c42
========================================
https://cloud.tencent.com/developer/news/678647
(3)三维卷积(3D Convolution)
卷积有三个维度(高度、宽度、通道),沿着输入图像的3个方向进行滑动,最后输出三维的结果,如下图:
(4)1x1卷积(1 x 1 Convolution)
当卷积核尺寸为1x1时的卷积,也即卷积核变成只有一个数字。如下图:
从上图可以看出,1x1卷积的作用在于能有效地减少维度,降低计算的复杂度。1x1卷积在GoogLeNet网络结构中广泛使用。
2、反卷积(转置卷积)(Deconvolution / Transposed Convolution)
卷积是对输入图像提取出特征(可能尺寸会变小),而所谓的“反卷积”便是进行相反的操作。但这里说是“反卷积”并不严谨,因为并不会完全还原到跟输入图像一样,一般是还原后的尺寸与输入图像一致,主要用于向上采样。从数学计算上看,“反卷积”相当于是将卷积核转换为稀疏矩阵后进行转置计算,因此,也被称为“转置卷积”
如下图,在2x2的输入图像上应用步长为1、边界全0填充的3x3卷积核,进行转置卷积(反卷积)计算,向上采样后输出的图像大小为4x4
3、空洞卷积(膨胀卷积)(Dilated Convolution / Atrous Convolution)
为扩大感受野,在卷积核里面的元素之间插入空格来“膨胀”内核,形成“空洞卷积”(或称膨胀卷积),并用膨胀率参数L表示要扩大内核的范围,即在内核元素之间插入L-1个空格。当L=1时,则内核元素之间没有插入空格,变为标准卷积。
如下图为膨胀率L=2的空洞卷积:
4、可分离卷积(Separable Convolutions)
(1)空间可分离卷积(Spatially Separable Convolutions)
空间可分离卷积是将卷积核分解为两项独立的核分别进行操作。一个3x3的卷积核分解如下图:
分解后的卷积计算过程如下图,先用3x1的卷积核作横向扫描计算,再用1x3的卷积核作纵向扫描计算,最后得到结果。采用可分离卷积的计算量比标准卷积要少。
(2)深度可分离卷积(Depthwise Separable Convolutions)
深度可分离卷积由两步组成:深度卷积和1x1卷积。
首先,在输入层上应用深度卷积。如下图,使用3个卷积核分别对输入层的3个通道作卷积计算,再堆叠在一起。
再使用1x1的卷积(3个通道)进行计算,得到只有1个通道的结果
重复多次1x1的卷积操作(如下图为128次),则最后便会得到一个深度的卷积结果。
完整的过程如下:
5、扁平卷积(Flattened convolutions)
扁平卷积是将标准卷积核拆分为3个1x1的卷积核,然后再分别对输入层进行卷积计算。这种方式,跟前面的“空间可分离卷积”类似,如下图:
6、分组卷积(Grouped Convolution)
2012年,AlexNet论文中最先提出来的概念,当时主要为了解决GPU显存不足问题,将卷积分组后放到两个GPU并行执行。
在分组卷积中,卷积核被分成不同的组,每组负责对相应的输入层进行卷积计算,最后再进行合并。如下图,卷积核被分成前后两个组,前半部分的卷积组负责处理前半部分的输入层,后半部分的卷积组负责处理后半部分的输入层,最后将结果合并组合。
7、混洗分组卷积(Shuffled Grouped Convolution)
在分组卷积中,卷积核被分成多个组后,输入层卷积计算的结果仍按照原先的顺序进行合并组合,这就阻碍了模型在训练期间特征信息在通道组之间流动,同时还削弱了特征表示。而混洗分组卷积,便是将分组卷积后的计算结果混合交叉在一起输出。
如下图,在第一层分组卷积(GConv1)计算后,得到的特征图先进行拆组,再混合交叉,形成新的结果输入到第二层分组卷积(GConv2)中:
========================================
https://blog.csdn.net/m0_45447650/article/details/125770741
一、堆叠小卷积核
1.为什么要用大卷积核代替小卷积核?
大卷积核
优点:感受域范围大
举例:AlexNet、LeNet等网络都使用了比较大的卷积核,如5×5、11×11
缺点:参数量多:计算量大
小卷积核
优点:参数量少;计算量小;整合三个非线性激活层代替单一非线性激活层,增加模型判别能力
举例:VGG之后
缺点:感受域不足;深度堆叠卷积(也就是堆叠非线性激活),容易出现不可控的因素
2.为什么堆叠小卷积核参数量要比大卷积核少?
设输入尺寸为5×5×10,输出尺寸为1×1×10
参数计算:
1个5×5卷积:5×5×10×10 = 2500
2个3×3卷积:3×3×10×10×2 = 1800
相差约1.4倍
1个7×7卷积:7×7×10×10 = 4900
3个3×3卷积:3×3×10×10×3 = 2700
相差约1.8倍
3.输入输出图片通道数一致时堆叠小卷积核参数量才更小
这是为什么呢?
设输入尺寸为15×15×3,输出尺寸为11×11×64
1个5×5卷积:5×5×3×64 = 4800
2个3×3卷积:3×3×3×64+3×3×64×64 = 38592
相差约8倍
设输入尺寸为11×11×64,输出尺寸为7×7×64
1个5×5卷积:5×5×64×64 = 102400
2个3×3卷积:3×3×64×2 = 1152
相差约88.8倍
这就是解释了为什么很多网络的第一层使用的都是7×7的大卷积核接受输入图片,因为网络开头使用小卷积核进行下采样参数量会更大。
4.感受野计算
感受野的计算是迭代计算
感受野计算公式:RF_{l+1}=RF_{l}+(kernel\_size-1) \times stride
1个5×5卷积:RF = 5
2个3×3卷积:RF = 3+(3-1)×1 = 5
1个7×7卷积:RF = 7
3个3×3卷积:RF = 3+(3-1)×1+(3-1)×1 = 7
二、空洞卷积:能否让固定大小的卷积核看到更大范围的区域?
标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。pooling下采样操作导致的信息丢失是不可逆的,这不利于像素级任务,用空洞卷积代替pooling的作用(成倍的增加感受野)更适用于语义分割。
三、非对称卷积:卷积核一定是正方形吗?
将标准3×3卷积分成一个1×3卷积和3×1卷积,在不改变感受野大小的情况下可减少计算量
标准卷积计算量:9×9 = 81次乘法
非对称卷积计算量:3×15+3×9 = 72次乘法
注意:非对称卷积用在分辨率为12-20大小的特征图上效果会比较好五、分组卷积:卷积只能在同一组进行吗?
组卷积是对输入特征图进行分组,每组分别进行卷积。假设输入特征图的尺寸为C*H*W(12×5×5),输出特征图的数量为N(6)个,如果设定要分成G(3)个groups,则每组的输入特征图数量为C/G(4),每组的输出特征图数量为N/G(2),每个卷积核的尺寸为(C/G)*K*K(4×5×5),卷积核总数仍为N(6)个,每组的卷积核数量为N/G(2),每个卷积核只与其同组的输入特征图进行卷积,卷积核的总参数量为N*(C/G)*K*K,可见,总参数量减少为原来的1/G。
举例:ResNext
缺点:分组点卷积某个通道仅来自一小部分输入通道,阻止了信息流动,特征表示
分组卷积能否对通道进行随机分组?
为达到特征之间的互相通信,除了采用dense pointwise convolution,还可以使用channel shuffle。如图b所示,就是对group convolution之后的特征图进行“重组”,这样可以保证下面的卷积其输入来自不同的组,因此信息可以在不同组之间流转。图c进一步的展示了这一过程,相当于“均匀的打乱”。
举例:ShuffleNet
六、拓展卷积:每层卷积只能用一种尺寸的卷积核吗?
传统的层叠式网络,基本上都是一个个卷积层的堆叠,每层只用一个尺寸的卷积核,例如VGG结构中使用了大量的3×3卷积层。事实上,同一层feature map可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好,为了尽可能的减少参数,一般先用1×1的卷积将特征图映射到隐空间,再在隐空间做卷积。
七、通道注意力:通道间的特征都是平等的吗?
无论是在Inception、DenseNet或者ShuffleNet里面,我们对所有通道产生的特征都是不分权重直接结合的,那为什么要认为所有通道的特征对模型的作用都是相等的呢?一个卷积层中往往有数以千计的卷积核,每个卷积核都对应了特征,于是那么多特征要怎区分?这个方法就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照计算出来的重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
举例:SENet
八、可变性卷积:卷积核形状一定是矩形吗?
规则形状的卷积核(比如一般用的正方形3×3卷积)可能会限制特征的提取,如果赋予卷积核形变的特征,让网络根据label反传下来的误差自动的调整卷积核的形状,适应网络重点关注的感兴趣的区域,就可以提取更好的特征。例如,网络会根据原位置(a),学习一个offset偏移量,得到新的卷积核(b)(c)(d),那么一些特殊情况就会成为这个更泛化的模型的特例,例如图(c)表示从不同尺度物体的识别,图(d)表示旋转物体的识别。
缺点:由于需要计算卷积核的偏移量,故其参数量会有一定增加。
举例:该方法多用于目标检测
九、总结
1.卷积核方面
大卷积核用多个小卷积核代替
单一尺寸卷积核用多尺寸卷积核代替
固定形状卷积核趋于使用可变性卷积核
使用1×1卷积核(bottleneck结构)
2.卷积层通道方面
标准卷积用depthwise卷积代替
使用分组卷积
分组卷积后使用channel shuffle
通道加权计算
3.卷积层连接方面
使用skip connection,让模型更深(ResNet)
densely connection,使每一层都融合其他层的特征输出(DenseNet)
————————————————
原文链接:https://blog.csdn.net/m0_45447650/article/details/125770741
========================================
https://zhuanlan.zhihu.com/p/59839551?utm_id=0
========================================