理解为什么要将全连接层转化为卷积层
理解为什么要将全连接层转化为卷积层
1.全连接层可以视作一种特殊的卷积
考虑下面两种情况:
- 特征图和全连接层相连,AlexNet经过五次池化后得到7*7*512的特征图,下一层全连接连向4096个神经元,这个过程可以看做有4096个7*7*512的卷积核和7*7*512的特征图进行卷积操作,最终得到1*1*4096的特征图,等价与全连接得到4096个神经元。
- 全连接层和全连接层相连,AlexNet的再下一层依然是4096个神经元,即4096个神经元和4096个神经元全连接,由(1)我们得到了1*1*4096的特征图,本次全连接过程可以看做存在4096个1*1*4096个卷积核,依次和1*1*4096的特征图进行卷积操作,等价与全连接。
2.网络改成全卷积形式后在某些场景可以提升效率
CS231课程中有如下陈述: 实际操作中,每次这样的变换都需要把全连接层的权重W重塑成卷积层的滤波器。那么这样的转化有什么作用呢?它在下面的情况下可以更高效:让卷积网络在一张更大的输入图片上滑动(译者注:即把一张更大的图片的不同区域都分别带入到卷积网络,得到每个区域的得分),得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。
举个例子,如果我们想让224x224尺寸的浮窗,以步长为32在384x384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6x6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224x224的输入图片经过卷积层和汇聚层之后得到了[7x7x512]的数组,那么,384x384的大图片直接经过同样的卷积层和汇聚层之后会得到[12x12x512]的数组(因为途径5个汇聚层,尺寸变为384/2/2/2/2/2 = 12)。然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出(因为(12 - 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6x6个位置的得分!
面对384x384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224x224块进行多次评价,其效果和使用把全连接层变换为卷积层后的卷积神经网络进行一次前向传播是一样的。自然,相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效得多,因为36次计算都在共享计算资源。这一技巧在实践中经常使用,一次来获得更好的结果。比如,通常将一张图像尺寸变得更大,然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分,然后在求这些分值的平均值。
上面给出了转化为全卷积的两个理由,一是不用限制死输入图像的大小,提供方便。二是前向传播时效率更高。
我的理解与推理
首先解释方便,对于384*384的图片,不修改AlexNet的结构使之适应384*384(依然使用原来224x224输入的结构),直到经过汇聚层得到[12x12x512]的数组时,网络运行没有任何问题,按照原来的架构,接下来要将特征图平铺和4096个神经元全连接,这时候就出问题了,因为原架构平铺后是7x7,现在是12x12,无法使用之前的参数矩阵了,但是将全连接层转化为卷积层后可继续进行,并最终得到6x6的正确输出,仅仅将网络的全连接层等价转化为卷积层,就能接收更大的图片,这显然方便了很多。
然后解释高效,第一层卷积,对于224x224的一张图片,假设卷积耗时为t,那么前向传播时,36张图片的时间为36t,对于384x384的图片,耗时同样为6*6*t = 36t,假设下一层为池化层,每次2x2池化的时间为ti,对于36张224x224的图片,总耗时36*112*112*ti = 451584ti,对于384x384的图片,耗时为192*192*ti = 36864ti << 451584ti,类似进行计算下去,发现全卷积每一层的耗时都少的多。因此全卷积效率更高,直观上如何得到这个结论呢?将384x384的图片按照32的步长切成224x224后得到36张图片,这36张图片有很多区域重叠了,本来一次池化就可以得到结果的,但是输入36张图片后,相同区域进行了多次重复池化操作,因此耗费了更多的时间。