VGG卷积核为什么取33 ?
VGG使用33卷积核的优势是什么?
Resnet 主要解决什么问题 为什么会有ResNet?
深度网络退化的原因
Resnet的针对网络退化提出的残差网络
Resnet网络结构
Resnet网络结构中如何实现的下采样
Resnet50网络结构Resnet特点
vgg16与 resnet152 哪个参数多
Resnet为什么work?
梯度爆炸和梯度消失的原因
BN层的作用
为什么BN层一般用在线性层和卷积层后面,而不是放在非线性单元后
什么是卷积
为什么要引入卷积
卷积的种类
空洞卷积(扩张卷积)
标准卷积
分组卷积
深度可分离卷积原理
从参数量和计算量角度与传统卷积的区别
Depthwise Convolution与Pointwise Convolution
卷积后特征图大小计算卷积层的参数量,计算量
卷积核为什么都是奇数
模型加速中卷积与BN融合的方法
1X1卷积核如何工作的和优势
1x1卷积核的作用
Global Average Pooling
为什么现在不用大核卷积
如何处理不同大小的图片的输入
卷积操作如何加速
上采样、上池化、双线性插值、反卷积梳理
如何计算感受野 (Receptive Field)
VGG卷积核为什么取3 * 3 ? VGG使用3*3卷积核的优势是什么?
在VGG中,使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5*5卷积核,这样做的主要目的是在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。
比如,3个步长为1的3x3卷积核的一层层叠加作用可看成一个大小为7的感受野(其实就表示3个3x3连续卷积相当于一个7x7卷积),其参数总量为 3x(9xC^2) ,如果直接使用7x7卷积核,其参数总量为 49xC^2 ,这里 C 指的是输入和输出的通道数。很明显,27xC2小于49xC2,即减少了参数;而且3x3卷积核有利于更好地保持图像性质。
Resnet 主要解决什么问题
大意是神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。因为我们知道图像是具备局部相关性的,那其实可以认为梯度也应该具备类似的相关性,这样更新的梯度才有意义,如果梯度接近白噪声,那梯度更新可能根本就是在做随机扰动。
有了梯度相关性这个指标之后,作者分析了一系列的结构和激活函数,发现resnet在保持梯度相关性方面很优秀,(相关性衰减从 1 / 根号(2^L) 到 1 / 根号(L) )。这一点其实也很好理解,从梯度流来看,有一路梯度是保持原样不动地往回传,这部分的相关性是非常强的。
为什么会有ResNet?
在ResNet诞生之前,AlexNet、VGG等这些比较主流的网络都是简单的堆叠层,比较明显的现象是,网络层数越深,识别效果越好。但事实上,当网络层数达到一定深度的时候,准确率就会达到饱和,然后迅速下降。
深度网络退化的原因
由于反向传播算法中的链式法则,如果层层之间的梯度均在(0,1)之间,层层缩小,那么就会出现梯度消失。反之,如果层层传递的梯度大于1,那么经过层层扩大,就会出现梯度爆炸。所以,简单的堆叠层将不可避免的出现网络退化的现象。
虽然梯度消失/爆炸是网络隐藏层太深所导致的,但是在论文中,已经说了这问题主要通过标准化初始化和中间规范化层来解决。所以网络退化并不是因为梯度消失/爆炸导致的,那网络退化问题到底是由什么导致的呢?另一篇论文给出了答案:The Shattered Gradients Problem: If resnets are the answer, then what is the question?
大意是神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。我们知道图像是具备局部相关性的,那其实可以认为梯度也应该具备类似的相关性,这样更新的梯度才有意义,如果梯度接近白噪声,那梯度更新可能根本就是在做随机扰动。
Resnet的针对网络退化提出的残差网络
基于网络退化问题,论文的作者提出了残差网络的概念。一个残差块的数学模型如下图所示。残差网络和之前的网络最大的不同就是多了一条identity的捷径分支。而因为这一条分支的存在,使得网络在反向传播时,损失可以通过这条捷径将梯度直接传向更前的网络,从而减缓了网络退化的问题。
在第二节分析网络退化的原因时,我们了解到梯度之间是有相关性的。我们在有了梯度相关性这个指标之后,作者分析了一系列的结构和激活函数,发现resnet在保持梯度相关性方面很优秀, 相关性衰减从 1 / 根号(2^L) 到 1 / 根号(L) 。这一点其实也很好理解,从梯度流来看,有一路梯度是保持原样不动地往回传,这部分的相关性是非常强的。
除此之外,残差网络并没有增加新的参数,只是多了一步加法。而在GPU的加速下,这一点额外的计算量几乎可以忽略不计。
我们可以看到,因为残差块最后是 F ( x ) + x 的操作,那么意味着 F ( x ) 与 x 的shape必须一致。在实际的网络搭建中,还可以利用1x1的卷积改变通道数目,其中上图左边是ResNet-34所用到的结构,右图这种类似瓶颈一样的结构就是ResNet-50/101/152所用到的结构。
而右边这样做有效减少了参数量,两者计算量对比:
左边的参数量为:3x3x256x256+3x3x256x256 = 1,179,648
右边的参数量为:1x1x256x64+3x3x64x64+1x1x64x256 = 69,632
可以看到,我们在一个残差块上就减少了2个数量级的参数,而在ResNet的一系列网络搭建过程中,是将这些结构大量堆叠起来。
Resnet网络结构
(1)起始阶段都经历了相同的conv1和maxpool的过程。
(2)不同深度的ResNet都是由基本残差块堆叠而成。18,34-layer的基本模块记为Basicblock,包含2次卷积;50,101,152layer的基本模块记为Bottleneck,包含3次卷积。
(3)2阶段堆叠的残差块完全相同。因为输入到输出是56→56,无下采样过程。
(4)3至5阶段堆叠的第一个残差块和其余残差块是不同的。解释:每个阶段均对特征图像大小进行下采样。以50layer–conv3_x为例,仔细思考残差块的堆叠模式可以发现,下采样过程发生在4个堆叠残差块中的第一个,因为这里实现了特征图尺寸从56→28的过程;而对于其余3个残差块,特征图的维度全部是28→28,因此这3个的结构是完全相同的
Resnet网络结构中如何实现的下采样
下采样的卷积实现思路? 在PyTorch中使用nn.Conv2d实现卷积,通常会使用的参数如下: torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, bias=True) 因此实现下采样会用到如下操作(虽然还不够具体,是个思路雏形):
特征图尺寸减半:卷积步长 stride=2。
特征图通道加倍:卷积核数目out_channels=4*in_channels(因为H/2,W/2,特征图缩小为1/4,所以通道数x4)。
下采样的具体实现? 参照上面的思路,Bottleneck的两种模式如下:实现的关键点就是我们需要判断出当前位置需要哪种模式,并设置正确的卷积步长。
Resnet50网络结构
Resnet 输入 INPUT经过ResNet50的5个阶段(Stage 1、Stage 2、……、Stage 5)得到输出 OUTPUT。
在Stage1 中,形状为 (3,224,224)的输入先后经过7x7卷积层、BN层、ReLU激活函数成为 (64, 112, 112)的大小,然后经过 3X3 的步长为2的 MaxPooling层得到了形状为 (64, 56, 56)的输出。
Stage 2 的输入的形状为 (64, 56, 56),输出的形状为 (256, 56, 56)。
Stage 3 的输入的形状为 (256, 56, 56),输出的形状为 (512, 28, 28)。
Stage 4 的输入的形状为 (512, 28, 28),输出的形状为 (1024, 14, 14)。
Stage 5 的输入的形状为 (1024, 14, 14),输出的形状为 (2048, 7, 7)。
最后加上 average pooling 变为 2048 的特征,再加全连接映射为1000维
Resnet特点
残差网络在表征方面不存在直接优势,并不能更好的表征某一方面的特征,但是Resnet允许逐层的深度表征更多模型。
残差网络能使前馈式/反传播网络更顺利的进行,可使优化更深的模型更简单。
shortcut不产生额外参数不增加计算复杂度,能简单的添加到叠加层的输出。通过SGD,模型还是可以被训练成端到端的模式。
vgg16与 resnet152 哪个参数多
应该是VGG16参数量更多,因为ResNet152是用了Bottleneck Design结构。
这个结构有两个1 * 1 和一个3 * 3的卷积组成,大大缩减了参数量。
Resnet为什么work?
残差本质是y=x+f(x),激活后f(x)>=0,在求梯度时为1+f’(x),保证梯度始终在1附近,这样两式一起就保证了“就算没学到有用的东西,也不会产生不利的信息,避免了梯度消失”
梯度消失那个的原因是:如果梯度小于1(假设0.5),那多层级连之后(假设三层),梯度就只剩下0.5^3=0.125,成指数形式衰减,很快就到了0附近了,而基于梯度下降的参数更新方法是:新参数=老参数+学习率*梯度,这样的话参数根本无法更新。反之,如果梯度大于1,就是梯度在级连时以指数形式爆炸。
前后向传播角度分析: 在前向传播中,输入信号可以从任意底层直接传播到高层。由于包含了一个天然的恒等映射,一定程度上可以解决网络退化问题。
反向传播时:错误信号可以不经过任何中间权重矩阵变换直接传播到低层,一定程度上可以缓解梯度弥散问题(即便中间层矩阵权重很小,梯度也基本不会消失)。综上,可以认为残差连接使得信息前后向传播更加顺畅。
梯度爆炸和梯度消失的原因
梯度消失与梯度爆炸出现的原因基本一致,一般可能是网络层数过深、激活函数、损失函数设置与参数初始化问题。
学过梯度下降理论就很好理解,无非就是求梯度过程某个值过大过小或链式法则层数过多导致累积效果过大。
梯度消失:隐层过多;不合适的激活函数(也有可能产生梯度爆炸)
梯度爆炸:隐层过多;权重初始值过大
反向传播算法根据链式求导法则,如果某部分比如激活函数求导的值持续小于1,那么随着网络变深效果累积就会导致梯度以指数形式衰减,即发生了梯度消失;相应的如果持续大于1,那么最终的梯度信息会以指数形式增加,最终发生了梯度爆炸。
BN层的作用
(1)加快收敛速度:在深度神经网络中中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果把 每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
(2)防止梯度爆炸和梯度消失:
以sigmoid函数为例,sigmoid函数使得输出在[0,1]之间,实际上当x道了一定的大小,经过sigmoid函数后输出范围就会变得很小
梯度消失:在深度神经网络中,如果网络的激活输出很大,其对应的梯度就会很小,导致网络的学习速率就会很慢,假设网络中每层的学习梯度都小于最大值0.25,网络中有n层,因为链式求导的原因,第一层的梯度将会小于0.25的n次方,所以学习速率相对来说会变的很慢,而对于网络的最后一层只需要对自身求导一次,梯度就大,学习速率就会比较快,这就会造成在一个很深的网络中,浅层基本不学习,权值变化小,而后面几层网络一直学习,后面的网络基本可以表征整个网络,这样失去了深度的意义。(使用BN层归一化后,网络的输出就不会很大,梯度就不会很小)
梯度爆炸:第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n,假如激活层斜率均为最大值0.25,所有层的权值为100,这样梯度就会指数增加。(使用bn层后权值的更新也不会很大)
(3)BN算法防止过拟合:在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。
为什么BN层一般用在线性层和卷积层后面,而不是放在非线性单元后
因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。其实想想也是的,像relu这样的激活函数,如果你输入的数据是一个高斯分布,经过他变换出来的数据能是一个什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了,这样不是很高斯了
什么是卷积
卷积是在特征图上进行滑动的矩阵,它的参数是可学习的,然后计算矩阵跟被滑动到的区域内的像素点进行内积计算,再求和。这种操作可以使得卷积学习到局部特征,并且每个被滑动到的区域之间都共享了权重。共享权重操作使得卷积相比全连接网络节省了大量的参数。
为什么要引入卷积
卷积可以通过共享权重来减少大量的参数量。例如使用全连接层会导致参数量太多,假如输入的图片尺寸大小为 100010003,即 3 百万个像素点,假如全连接层有 1000 个节点,则总共有 30 亿 1000 个参数。但是换成使用卷积核组数为 100 的 55 的卷积,则仅需 553100 + 100,即 7600 个参数
图片中存在重复的特征,卷积可以通过共享权重的方式更高效率地将这些特征学习出来
图片固有的空间特征,如果使用全连接层或 RNN 来学习,则会破坏图片的空间特征,而卷积则可以不破坏图片的空间特征。
卷积的种类
卷积现在已衍生出了各种类型,包括标准卷积、反卷积、可分离卷积、分组卷积等等
卷积核(Kernel):卷积操作的感受野,直观理解就是一个滤波矩阵,普遍使用的卷积核大小为3×3、5×5等;
步长(Stride):卷积核遍历特征图时每步移动的像素,如步长为1则每次移动1个像素,步长为2则每次移动2个像素(即跳过1个像素),以此类推;
填充(Padding):处理特征图边界的方式,一般有两种,一种是对边界外完全不填充,只对输入像素执行卷积操作,这样会使输出特征图的尺寸小于输入特征图尺寸;另一种是对边界外进行填充(一般填充为0),再执行卷积操作,这样可使输出特征图的尺寸与输入特征图的尺寸一致;
通道(Channel):卷积层的通道数(层数)。
如下图是一个卷积核(kernel)为3×3、步长(stride)为1、填充(padding)为1的二维卷积
空洞卷积(扩张卷积)
空洞卷积主要为了解决图像分割中的一些问题而提出的,在FCN中通过pooling增大感受野缩小图像尺寸,然后通过upsampling还原图像尺寸,但是这个过程中造成了精度的损失,那么为了减小这种损失理所当然想到的是去掉pooling层,然而这样就导致特征图感受野太小,因此空洞卷积应运而生。
空洞卷积也叫扩张卷积或者膨胀卷积,简单来说就是在卷积核元素之间加入一些空格(零)来扩大卷积核的过程。
假设以一个变量a来衡量空洞卷积的扩张系数,则加入空洞之后的实际卷积核尺寸与原始卷积核尺寸之间的关系:K = K + (k-1)(a-1)
其中k为原始卷积核大小,a为卷积扩张率(dilation rate),K为经过扩展后实际卷积核大小。除此之外,空洞卷积的卷积方式跟常规卷积一样。我们用一个扩展率a来表示卷积核扩张的程度。比如说a=1,2,4的时候卷积核核感受野如下图所示:
当a=1,原始卷积核size为3 * 3,就是常规卷积。a=2时,加入空洞之后的卷积核:size=3+(3-1) * (2-1)=5,对应的感受野可计算为:(2 ^log(a)+2)-1=7。a=3时,卷积核size可以变化到3+(3-1)(4-1)=9,感受野则增长到 (2 ^log(a)+2)-1=15。有趣的是,与这些操作相关的参数的数量是相等的。我们「观察」更大的感受野不会有额外的成本。因此,扩张卷积可用于廉价地增大输出单元的感受野,而不会增大其核大小,这在多个扩张卷积彼此堆叠时尤其有效。
标准卷积
标准卷积:标准卷积(该介绍均已stride=1为例展开)也可分为padding=0,这种情况下输出分辨率为输入-卷积核+1;
padding=kernel/2向下取整数,这种情况是输出分辨率等于输入尺寸。
padding=kernel-1,这种情况是输出大于输入分辨率。
分组卷积
将图一卷积的输入feature map分成组,每个卷积核也相应地分成组,在对应的组内做卷积,如上图2所示,图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成个feature map。
我们居然用了同等的参数量运算量生成了g个feature map!!!
所以group conv常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature map,大量的feature map意味着能够编码更多的信息!
从分组卷积的角度来看,分组数就像一个控制旋钮,最小值是1,此时的卷积就是普通卷积;
最大值是输入feature map的通道数,此时的卷积就是depthwise sepereable convolution,即深度分离卷积,又叫逐通道卷积。
深度可分离卷积原理 从参数量和计算量角度与传统卷积的区别