总结起来有如下作用:
1,灵活的控制特征图的深度
2,减少参数
3,现了跨通道的信息组合,并增加了非线性特征
知乎参考
1x1的卷积核由于大小只有1x1,所以并不需要考虑像素跟周边像素的关系,它主要用于调节通道数,对不同的通道上的像素点进行线性组合,然后进行非线性化操作,可以完成升维和降维的功能,如下图所示,选择2个1x1大小的卷积核,那么特征图的深度将会从3变成2,如果使用4个1x1的卷积核,特征图的深度将会由3变成4。
前面所说的降维,其实也是减少了参数,因为特征图少了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图,二次提取特征,使得新特征图的特征表达更佳。接着再通过两个例子来看看它是如何减少参数的。
1、在GoogleNet的3a模块中,假设输入特征图的大小是 28 × 28 × 192 28 \times 28 \times 192 28×28×192, 1 × 1 1 \times 1 1×1卷积通道为64, 3 × 3 3 \times 3 3×3卷积通道为128, 5 × 5 5 \times 5 5×5卷积通道为32,如下图所示:
左边的卷积核参数计算如下:
192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
而右图的3x3卷积层前加入通道数为96的1x1的卷积,5x5的特征图后面加入通道数为16的1x1的卷积,参数的计算如下:
192 × (1×1×64) +(192×1×1×96+ 96 × 3×3×128)+(192×1×1×16+16×5×5×32)= 157184
Inception结构相关内容补充:
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
上面左图是作者提出来的基本结构,说明如下:
(1)采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
(2)之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
(3)文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
(4)网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
Factorizing Convolutions with Large Filter Size,也就是分解大的卷积,用小的卷积核替换大的卷积核,因为大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,比如5x5卷积核参数是3x3卷积核的25/9=2.78倍。因此可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感受野范围的同时又减少了参数量),也就产生了Inception V2;而nxn的卷积核又可以通过1xn卷积后接nx1卷积来替代,也就是Inception V3结构,但是作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间).
如下图:从左到右是Inception V1~IncVeption V3,需要指出的是将7´7卷积拆成1x7卷积和7x1卷积,比拆成3个3x3卷积更节约参数。
2、在ResNet模块中,假设输入的特征图的维度是wh256,并且最后要输出的也是256个特征图,如下图所示:
左边的计算如下:
w × h × 256 × 3 × 3 × 256 = 589824 × w × h w \times h \times 256 \times 3 \times 3 \times 256 =589824 \times w \times h w×h×256×3×3×256=589824×w×h
右边的计算如下:
w × h × 256 × 1 × 1 × 64 + w × h × 64 × 3 × 3 × 64 + w × h × 64 × 1 × 1 × 256 = 69632 × w × h w \times h \times 256 \times 1 \times 1 \times 64 + w \times h \times 64\times3\times3 \times 64 +w \times h \times 64 \times 1 \times 1 \times 256 = 69632 \times w \times h w×h×256×1×1×64+w×h×64×3×3×64+w×h×64×1×1×256=69632×w×h
结果相差大概8.5倍。
使用 1 × 1 1 \times 1 1×1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化, 3 × 3 3 \times 3 3×3,64channels的卷积核前面添加一个 1 × 1 1 \times 1 1×1,28channels的卷积核,就变成了 3 × 3 3 \times 3 3×3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。因为 1 × 1 1 \times 1 1×1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep,增加非线性特性。
针对与分类问题,正样本则是我们想要正确分类出的类别所对应的样本。
例如,我们要对一张图片进行分类,以确定其是否属于汽车,那么在训练的时候,汽车的图片则为正样本。
负样本原则上可以选取任何不是汽车的其他图片,这样就可以训练出来一个汽车的分类网络。
对这个网络进行测试会发现,它会将一些非汽车的图片误报成汽车,这些误报的图片则为“难分样本”,后续进行训练的时候,将这些难分样本加入至负样本集合中进行训练,最后得到的网络模效果会更好一些,这个过程就叫做“难例挖掘”。
另外,在选取负样本的时候,原则上是可以选择任意非汽车的图片作为负样本,但是比较合理的情况应该是要考虑到实际应用场景,例如实际应用是对行车记录仪上面捕捉到的图片进行分类,那么,负样本则应该是捕捉到的其他非汽车的图片,例如马路,树木,路灯等。
笔者第一次见到消融实验(Ablation experiment)这个概念是在论文《Faster R-CNN》中。
消融实验类似于“控制变量法”。
假设在某目标检测系统中,使用了A,B,C,取得了不错的效果,但是这个时候你并不知道这不错的效果是由于A,B,C中哪一个起的作用,于是你保留A,B,移除C进行实验来看一下C在整个系统中所起的作用。
ROI是在原图中的感兴趣区域,可以理解为目标检测的候选框也就是region of proposals。
我们将原图进行特征提取的时候,就会提取到相应的feature map。那么相应的ROI就会在feature map上有映射,这个映射过程就是roipooling的一部分,一般ROI的步骤会继续进行max pooling,进而得到我们需要的feature map,送入后面继续计算。
根据ROIS提供的候选框坐标,映射到FeatureMap,然后进行max-pooling,和普通的max-pooling的不同之处在于池化窗口的内部的各自包含的特征值数量不一样。
下面这组图就是这个过程
输入是特征图
特征图片对应的建议区域
若想输出2*2 的feature map
我们就需要对把这个ROI区域分成4大块,每一块做一下max-pooling 得到最终的值
最终 的值就是
主要参考这三篇博客:
https://blog.csdn.net/yzf0011/article/details/75212513
https://blog.csdn.net/u011534057/article/details/51219959 (这篇末尾讲的特别好)
空间金字塔池化(Spatial Pyramid Pooling, SPP)
在一般的CNN结构中,在卷积层后面通常连接着全连接。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小(fixed-size)。但在现实中,我们的输入的图像尺寸总是不能满足输入时要求的大小。然而通常的手法就是裁剪(crop)和拉伸(warp)。
这样做总是不好的:图像的纵横比(ratio aspect) 和 输入图像的尺寸是被改变的。这样就会扭曲原始的图像。而Kaiming He在这里提出了一个SPP(Spatial Pyramid Pooling)层能很好的解决这样的问题, 但SPP通常连接在最后一层卷基层。
既然之前的CNN要求输入固定大小的图片,那么我们首先需要知道为什么CNN需要输入固定大小的图片?CNN大体包含3部分,卷积、池化、全连接。
首先是卷积,卷积操作对图片输入的大小会有要求吗?比如一个55的卷积核,我输入的图片是3081的大小,可以得到(26,77)大小的图片,并不会影响卷积操作。我输入600*500,它还是照样可以进行卷积,也就是卷积对图片输入大小没有要求,只要你喜欢,任意大小的图片进入,都可以进行卷积。
池化:池化对图片大小会有要求吗?比如我池化大小为(2,2)我输入一张3040的,那么经过池化后可以得到1520的图片。输入一张5322大小的图片,经过池化后,我可以得到2611大小的图片。因此池化这一步也没对图片大小有要求。只要你喜欢,输入任意大小的图片,都可以进行池化。
全连接层:既然池化和卷积都对输入图片大小没有要求,那么就只有全连接层对图片结果又要求了。因为全连接层我们的连接劝值矩阵的大小W,经过训练后,就是固定的大小了,比如我们从卷积到全连层,输入和输出的大小,分别是50、30个神经元,那么我们的权值矩阵(50,30)大小的矩阵了。因此空间金字塔池化,要解决的就是从卷积层到全连接层之间的一个过度。
也就是说在以后的文献中,一般空间金子塔池化层,都是放在卷积层到全连接层之间的一个网络层。
Convolutional Layers and Feature Maps
作者使用上图意在说明保留原图片的尺寸对实验的特征提取和结果都很重要
为什么会得固定大小的输出?
注意我们上面曾提到使用多个窗口(pooling窗口,上图中蓝色,青绿,银灰的窗口, 然后对feature maps 进行pooling,将分别得到的结果进行合并就会得到固定长度的输出), 这就是得到固定输出的秘密原因。
backbone这个单词原意指的是人的脊梁骨,后来引申为支柱,核心的意思。
在神经网络中,尤其是CV领域,一般先对图像进行特征提取(常见的有vggnet,resnet,谷歌的inception),这一部分是整个CV任务的根基,因为后续的下游任务都是基于提取出来的图像特征去做文章(比如分类,生成等等)。
主干网络,用来做特征提取的网络,代表网络的一部分,一般是用于前端提取图片信息,生成特征图feature map,供后面的网络使用。通常用VGGNet还有你说的Resnet,因为这些backbone特征提取能力是很强,并且可以加载官方在大型数据集(Pascal 、Imagenet)上训练好的模型参数,然后接自己的网络,进行微调finetune即可。
作者:酸辣土豆丝
链接:https://www.zhihu.com/question/399611596/answer/1575154591
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。