1*1的卷积核的作用

参考:https://zhuanlan.zhihu.com/p/22038289?refer=intelligentunit
https://iamaaditya.github.io/2016/03/one-by-one-convolution/
http://blog.csdn.net/yiliang_/article/details/60468655
http://blog.csdn.net/chaipp0607/article/details/60868689
http://blog.csdn.net/a1154761720/article/details/53411365

卷积

以下简要的概述一下卷积之后的输出数据的尺寸的求法,至于卷积的具体概念这里不再涉及。

滤波器的超参数

我们约定以下参数:
1. 滤波器(即filter)的数量为 K
2. 滤波器的空间尺寸为 F
3. 步长为 S
4. 零填充数量为 P

卷积之后

假设输入数据体的尺寸W1*H1*D1,输出数据体的尺寸是W2*H2*D2,那我们如何求得输出数据体的尺寸呢?在这里基于先前的约定,我们使用公式W2 = (W1-F+2P)/S+1;H2=(H2-F+2P)/S+1 ,D2 = K。我们会发现卷积之后的图像的深度其实是由filter的个数来决定的,而并不取决于原始数据的通道数。

一点注意

在上面求H2、W2的过程中,我们有时得到的W2、H2不是整数。如(W1-F+2P)/S+1 = (10-3+0)/2+1=4.5的结果不是整数,这就是说神经元不能整齐对称地滑过输入数据体。因此,这些超参数的设定就被认为是无效的。
解决的办法有:或者修改零填充(padding)值来让设置合理,或者修改输入数据体尺寸来让设置合理,或者用其他什么措施。

贴出一张卷积过程的动态图帮助理解
1*1的卷积核的作用_第1张图片

1*1的卷积

1*1的卷积并不会改变图像的分辨率,而会改变图像的深度。

过滤器的深度

首先我们应当明确的是局部连接的深度(即filter的第3个维度)总是与输入数据一致。具体来说,在CNN中,一般我们处理的数据都是M*N*D这样形式的图像。其中M、N代表图像的长和宽,而D代表图像的深度。当我们给定输入数据的时候,例如输入是28*28*192,此时我们指定filter的大小F =3,P=0,S = 1,K=96。那么根据先前的叙述可以求得卷积之后的W2=(28-3)/1+1 =26;H2=(28-3)/1+1=26,D2 = 96 最终得到的输出数据为26*26*96。仔细追究一下,那到底filter是怎样形式的?这个一开始我是比较疑惑的,但是现在明白了。我们把上面的例子更具体的展开,其实这个卷积核具体的形式是3*3*192,而不是单单的3*3,虽然在描述卷积核时从不提卷积核的深度192。而这个192就是输入数据的深度,也就是印证了上面一开始说的【局部连接的深度总是与输入数据一致】。因为这句约定俗成的话,所以在说卷积核的时候都不提卷积核的深度。

1*1卷积的作用

为什么需要1*1的卷积呢?

单通道输入

简单地看,如果我们的输入是一个单通道的图像,而卷积核就是1*1*1的(最后那个1一般不给出),那么1*1卷积的过程就如下图所示。在数学意义上讲就是对输入进行了比例缩放。因为1*1卷积核只有一个参数,这个核在输入上滑动,就相当于给输入数据乘以一个系数。
1*1的卷积核的作用_第2张图片

多通道输入

当输入是多通道的时候,可以实现跨通道的交互和信息整合。具有线性修正特性,实现多个feature map的线性组合,这个线性组合的权重由1*1 的卷积核内的元素决定,也可以实现feature map在通道个数上的变化,也就是实现经过1*1卷积之后的输出数据的通道数的变化。我们都知道【卷积之后的输出数据的通道数是由卷积核的个数决定的】,例如有16个卷积核,那么不用管输入数据如何,经过卷积之后的输出数据就是16通道的。正是由于可以控制输出数据的通道数的变化,使得1*1的卷积具有降维或者升维功能。
形象地用下面的图片来形象化上面的叙述,我们假设有1个6通道的输入,为了简单其间,每一个通道都是W*H大小的图像,我并没有画出一个立方体(应该是W*H*6),但这并不影响理解。
1*1的卷积核的作用_第3张图片
我们可以想象在立方体的深度方向的某一个具体位置(x,y)穿插而过得到的就是一个1*1*6大小的纤维。将该纤维同1*1卷积核卷积,就会得到一个数。用数学式表示就是
sum = 权重1*通道1的(x,y)+权重2*通道2的(x,y)+……+权重6*通道6的(x,y)。点积求和使得全部6个通道的对应位置的信息(像素值)被整合在一起。注意该卷积核的结果只有一个通道。这就是1*1卷积在多通道输入中所作的事情。倘若我们有多个1*1的卷积核,那么我们的输出的通道数也就是1*1卷积核的数目一致。

举个例子

举个例子,比如某次卷积之后的结果是W*H*6的特征,现在需要用1*1的卷积核将其降维成W*H*5,即6个通道变成5个通道。
那么我们应该怎样做?无需多言,自然能根据输出是5通道来决定使用5个1*1的卷积核即可。通过一次卷积操作,W*H*6将被1*1的卷积核变为W*H*1,这样的话,使用5个1*1的卷积核,显然可以卷积出5个W*H*1,再做通道的串接操作,就实现了W*H*5。

实际应用

我们可以通过一个例子来直观地感受使用1*1卷积的好处。以googlenet[3]中的inception模块为例,来说明1x1的卷积如何来减少模型参数。
1*1的卷积核的作用_第4张图片
左图是没有应用1*1卷积的情况,而右图是应用了1*1卷积的情况。
输入都是28x28x192大小;
对于左图的参数,卷积核大小以及卷积通道数分别为:包括三种卷积核,分别是1x1x64,3x3x128,5x5x32;
对于右图的参数,我们在3x3,5x5 convolution前新加入的1x1的卷积核分别为96和16通道的,在max pooling后加入的1x1卷积为32通道。
那么左图的参数为:(1x1x192x64)+(3x3x192x128)+(5x5x192x32) =387072
右图的参数个数为:(1x1x192x64)+(1x1x192x96)+(1x1x192x16)+(3x3x96x128)+(5x5x16x32)+(1x1x192x32)=163328

你可能感兴趣的:(机器学习)