在经典分类网络,比如LeNet、AlexNet中,在前面的卷积层提取特征之后都串联全连接层来做分类。但是近些年来,越来越多的网络,比如SSD,FasterRCNN的RPN,MTCNN中的PNet,都使用卷积层来代替全连接,也一样可以做到目标分类的效果,而且
- 更灵活,不需要限定输入图像的分辨率;
- 更高效,只需要做一次前向计算。
本文首先对全连接层和卷积层关系做分析,然后比较全连接层和卷积层的优缺点,自然也就搞清楚了为什么用卷积层替代全连接层这个问题了。
欢迎探讨,本文持续维护。
N/A
全连接层和卷积层只要设置好了对应的参数,可以在达到相同输入输出的效果,在这个意义上,在数学上可以认为它们是可以相互替换的。
下面我们以输入10 x 10 x 3的特征图,输出10 x 10 x 1的特征图来证明。
全连接层怎么做?全连接层输入10 x 10 x 3的特征图,首先将其reshape成一维的300个输入神经元,然后每个输出神经元的值都是这300个输入神经元的线性组合,最后将100个输出reshape成10 x 10 x 1的形状。
卷积层怎么做?卷积层可以直接用100个10 x 10 x 3的滤波器,分别直接贴着输入的10 x 10 x 3的输入特征图做滤波,得到100个一维的输出,然后把这个100个一维输出reshape成10 x 10 x 1的形状。这100个输出,每个也都是由输入特征图上300个像素点线性组合而来,在数学上和上面的全连接层理论上可以达到一样的效果。这里用到的卷积和通常我们看到的卷积唯一有点特殊的是,为了达到全连接(采集到所有输入特征图像素的信息)的效果,它的分辨率和输入特征图分辨率一样。
所以,由上面的讨论可知,全连接成可以用(分辨率和输入特征图相同的)卷积代替。
卷积层怎么做?假设卷积核大小为3 x 3的方形核,stride = 1, 为了输出分辨率不变padding用SAME方式。那么卷积核的形状是3 x 3 x 3,输出通道数为1,只用一个这样的卷积核按照常规卷积来做就行,输出10 x 10 x 1的特征图很容易。
全连接层怎么做?全连接层输入10 x 10 x 3 = 300个神经元,卷积的时候每次卷积只是连接了其中的一个3 x 3 x 3 = 27的子集,那么可以在做全连接的时候,除了这27个神经元设置连接关系,其余的 300 - 27 = 273个连接系数直接设置为0就可以了。做 10 x 10 x 1 = 100次这样的全连接,就可以得到100个输出神经元,再reshape成10 x 10 x 1的形状就可以了。
所以,由上面的讨论可以得到,卷积层只是全连接层的一个子集,把全连接的某些连接系数设置为0,就可以达到和卷积相同的效果。
由上一节的讨论可以知道,其实卷积层和全连接层在理论上是可以相互替代的,那么,为什么我们看到的趋势是全连接被卷积层替代,而不是卷积层被全连接层替代呢?这要从卷积层相比于全连接层两个工程上的优点来讲:
如果网络后面有全连接层,而全连接层的输入神经元个数就是固定的,那么反推上层卷积层的输出是固定的,继续反推可知输入网络的图片的分辨率是固定的。例如,LetNet由于由全连接层,输入就只能是28 x 28的。如果网络中的全连接层都用卷积层替代,网络中只有卷积层,那么网络的输出分辨率是随着输入图片的分辨率而来的,输出图中每一个像素点都对应着输入图片的一个区域(可以用stride,pooling来反算)。
同样以LeNet来做例子,如果一个图片是280 x 280的分辨率,为了识别图片中所有的数字(为了简单,假设每个数字都是在这个大图划分为10 x 10的网格中),那么为了识别这100个位置数字,那么至少需要做100次前向;而全卷积网络的特点就在于输入和输出都是二维的图像,并且输入和输出具有相对应的空间结构,我们可以将网络的输出看作是一张heat-map,用热度来代表待检测的原图位置出现目标的概率,只做一次前向就可以得到所有位置的分类概率。
本文首先在理论上论证了卷积层和全连接层的可互换性质,然后详细分析了在实践中用卷积层代替全连接层的两个好处,第一个是去掉全连接层对网络输入图像分辨率的限制;第二个好处是全卷积网络只需要做一次前向运算就可以获得一张目标所在位置的heat-map,节约了计算。