FC的作用
全连接层中的每一层是由许多神经元组成的(
1
×
4096
1×4096
1×4096)的平铺结构。
这里我们探讨的是:FC是怎么样把 3 × 3 × 5 3\times3\times5 3×3×5 的输出,转换成 1 × 4096 1\times4096 1×4096 这样长向量形式的。
其实在CNN中,FC将高维向量拉平的操作和前面的Conv层的操作是一样的,都是卷积,如下图所示:
从上图我们可以看出,我们用一个
3
×
3
×
5
3\times3\times5
3×3×5的 filter 去卷积激活函数的输出,得到的结果就是FC上一个神经元的输出,这个输出就是一个值(标量)。因为我们有4096个神经元,一个filter生成一个神经元上的值,所以我们需要 4096 个filter,即让一个filter.size()=3×3×5×4096
的卷积层去卷积前一层的feature map。
Note:
- 3×3×5为filter的长×宽×通道数
- 4096为filter的个数,即这一卷积层里面有4096个filter
和以往的Conv不同,这里的一个filter值产生一个神经元的标量而非常规的feature map。
两层FC的作用
上面是ZFNet的网络结构,它共有8层带参数的网络,5个卷积层,3个全连接层。
我们看Layer6和Layer7会发现二者的结构是一样的,那么为什么会有两个FC呢?
我们观察其它的经典网络时会发现,很多网络中都会出现2层FC,为什么是2层呢?明明一层就可以生成一个长向量,我们再把这个长向量送入Softmax层即可完成分类任务。
我们首先要明确CNN的本质,CNN其实就是一个非常长的多项式,阶数很高,元很多,最后求出一个长向量,我们再把这个长向量送入Softmax层得到这个长向量中每一个值的概率,取出最大的概率,再对应我们的label编号,我们就可以求出模型推算出的类别。
即神经网络的本质就是:多项式函数去拟合光滑函数。
我们这里的FC中一个神经元就可以看成一个多项式,我们用许多神经元去拟合数据分布,但是只用一层FC有时候没法解决非线性问题,而如果有两层或以上FC就可以很好地解决非线性问题了。
这跟感知机(Perception)是一样的,“单层感知机无法表示异或门”或者“单层感知机无法分离非线性空间”。
GAP替代FC
Global Average Pooling这个概念出自于《Network in Network》。Global Average Pooling是一种取代全连接的方式,主要是用来解决全连接的问题,其主要是是将最后一层的特征图进行整张图的一个均值池化,形成一个特征点,将这些特征点组成最后的特征向量(也就是一个长向量),我们在把这个长向量送进Softmax层中进行分类和概率的计算。
通道数代表了这个feature map是由几张图叠在一起的,GAP是将这些叠在一起的图拆开,每张图求一个[代表值],最后再将这些值组合起来形成一个长向量。
这其实就是实现了FC层的一个作用。
这样说其实并不严谨,GAP取代的其实是FC中的Flatten层,剩下的和FC是一样的。
也就是说,我们使用GAP生成的长向量去取代Flatten层生成的长向量——使用Flatten会耗费大量的算力,GAP的计算量明显少于Flatten!
举个例子。假如,最后的一层的数据是 10 个 6 × 6 6×6 6×6 的特征图(即 6 × 6 × 10 6×6×10 6×6×10),GAP是将每一个Channel的特征图计算一个均值,输出一个数据值,这样通道为 10 的特征图就会输出 10 个数据点,将这些数据点组成一个 1 × 10 1×10 1×10 的长向量,即为一个特征向量,之后再将这个长向量送入Softmax层中进行分类和概率的计算。
- 6×6是feature map的尺寸
- 10是Channel数
参考文献
- 蒋竺波:https://www.zhihu.com/question/41037974/answer/320267531