卷积核又称filter,过滤器。
每个卷积核有长宽深3个维度;
在某个卷积层中,可以有多个卷积核;下一层需要多少个feature map ,本层就需要多少个卷积核。
卷积核的长宽是人为指定的,长*宽 被称为 卷积核的尺寸。常用尺寸有1*1 ,3*3 ,5*5 。
卷积核的深度与当前图像的深度相同(即通道数保持相同)。指定卷积核时,只需要指定长宽两个参数,其通道数会默认与当前作用图像的通道数相同。
1*1卷积是大小为1*1的滤波器做卷积操作,不同于2*2、3*3等filter,没有考虑在前一特征层局部信息之间的关系。
卷积核:可以看作对某个局部的加权求和,它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸。卷积核的个数就对应输出的通道数,这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积核数量为128,那么卷积的参数有3x3x192x128,其中卷积截面大小为3*3,单个卷积的通道数是192,共128个卷积核。
卷积核的通道数应和输入的feature map的通道数一致,feature map通过卷积操作后得到的通道数则是卷积核filter的个数,即所使用卷积核的个数。
1.来源
Network In Network论文
最早出现在 Network In Network的论文中 ,使用1*1卷积是想加深加宽网络结构 。
如果1×1卷积核接在普通的卷积层后面,配合激活函数,即可实现network in network的结构。
2.应用
GoogleNet中的Inception、ResNet中的残差模块。
Inception举例
在Inception网络(论文Going Deeper with Convolutions)中图像输入进来后,通常可以选择直接使用像素信息(1x1卷积)传递到下一层,可以选择3x3卷积,可以选择5x5卷积,还可以选择max pooling的方式downsample刚被卷积后的feature maps。 但在实际的网络设计中,究竟该如何选择需要大量的实验和经验的。 Inception就不用我们来选择,而是将4个选项给神经网络,让网络自己去选择最合适的解决方案。但是这些卷积滤波器的设计也会在计算上造成很大的消耗,由于3*3卷积或者5*5卷积在几百个filter的卷积层上做卷积操作时相当耗时,所以1*1卷积在3*3卷积或者5*5卷积计算之前先降低维度。
普通的Inception模块:
从下往上看,本层输入的feature map 是28*28*192 。
注:卷积核的通道数与输入的feature map一致,而卷积核的个数与输出channel一致。
输入feature map | 卷积核大小 \ 卷积核参数 | 通道数 | 个数 | 卷积操作所生成的通道数 | 输出feature map |
28*28*192 | 1*1 | 192 | 64 | 64 | (28*28)*64 |
28*28*192 | 3*3 | 192 | 128 | 128 | (26*26)*128 |
28*28*192 | 5*5 | 192 | 32 | 32 | (24*24)*32 |
注: 卷积核通道数默认与所作用的feature map通道数相同,使用时也不写通道数,只写filter个数(即卷积核数量)。 图中红色部分channel个数可以理解为,是该卷积核与输入feature map作用完之后所生成的feature map 的通道数(channel个数)。或者理解为,是当前卷积核的个数(filter数)。
表格中 最后一列 输出feature map是 假设步长为1,padding=0,各卷积核作用后所生成的feature map,主要是想表现出卷积操作前后通道数的变化,无其他意义。
参数量:(1×1×192×64) + (3×3×192×128) + (5×5×192×32) = 153600
最终输出的feature map个数:64+128+32+192 = 416
(feature map尺寸是指 W、H是权值共享的sliding window,feature map的数量就是channels)
池化层不引人参数!
feature map个数就是filter个数,一个滤波器在前一个feature map上进行一次卷积操作(特征抽取)会产生一个feature map或者叫通道、深度。
加入1*1卷积的inception模块:
在3*3,5*5 卷积层前新加入的1x1的卷积核数量为96和16个的,max pooling后加入的1x1卷积核数量为32。
图中该层的参数:
(1×1×192×64)+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)+(1x1x32)=15904
最终输出的feature map个数: 64+128+32+32=256
(feature map尺寸是指 W、H是权值共享的sliding window,feature map的数量就是channels)
通过对比是否添加了1*1卷积核的两个inception模块,可以看到生成的feature map个数(即通道数)从416降低至256 ,参数量也大大降低。
所以,加入1×1的卷积后,在降低大量运算的前提下,降低了维度。
ResNet中残差模块举例
假设输入的feature map是w*h*256,并且最后要输出的是256个feature map。
(为追求两者一致性,需要把左侧图的64都改成256,且中间只有一层3*3*256的卷积层)
左侧操作数: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,,左侧参数大概是右侧的8.5倍。(实现降维,减少参数)
主要是1∗1卷积核可以先进行降维,降维之后需要的3∗3的卷积核数目就变少了。而真正占用参数量的是3∗3卷积核,1*1卷积核的参数量其实非常少,所以引入了1∗1卷积核来减少训练参数。
右侧图,在输出之前也有一个卷积核,feature map被 3*3,64的卷积核作用后 channel是64,只需添加一个 1*1,256的卷积核,只用64*256个参数就能把网络channel从64扩展四倍到256。(从64通道扩展到256通道)(实现升维,且参数量少)
跨通道信息交互举例
使用1*1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3*3,64channels的卷积核后面添加一个1*1,28channels的卷积核,就变成了3*3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window。
3. 1*1卷积作用
1*1卷积核进行降维或升维,是通过控制卷积核(通道数)实现的。
降维(缩减网络通道数,减少参数,减少计算量)
升维(用最少的参数拓宽网络channal)
跨通道信息交互(channal的变换)
添加非线性特性(可以增加网络深度)
备注:1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。
一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuro。
注:卷积核的通道数与输入的feature map一致,而卷积核的个数与输出channel一致。