这是卷积神经网络笔记第二篇,完整的笔记目录可以点击这里查看。
全连接层(Fully-connected Layer)中的神经元与前一层中的所有输出值都有完全连接,就像在常规神经网络中看到的那样。因此,它们的激活可以通过矩阵乘法和增加偏移来计算。下面详细讨论一下怎么将全连接层(FC层)转换为一般的卷积层(CONV层)。
值得注意的是,FC层和CONV层之间的唯一区别是CONV层中的神经元仅连接到输入中的局部区域,并且CONV层中的许多神经元共享参数。但是,这两种层的神经元都是通过点积进行计算的,所以它们的函数形式是相同的。因此,可以在FC层和CONV层之间进行转换:
对于任何一个CONV层,都可以转化为一个实现相同计算功能的FC层,只是转换以后,其权重矩阵将是一个大部分数据为0的大的矩阵。
相反,任何FC层都可以转换为CONV层。例如,K=4096的FC层正在处理大小为7×7×512的输入数据,可以等效地表示为F=7,P=0,S=1,K=4096的CONV层。换句话说,我们将过滤器大小设置为输入的大小,因此输出将仅为1×1×4096,因为只有一个深度列“适合”整个输入,从而得到与原始FC层相同的结果。
在这两种转换中,将FC层转换为CONV层在实践中特别有用。考虑一个ConvNet架构(AlexNet),它获取一个224x224x3的图像,然后使用一系列CONV层和池化层将图像减少到一个大小为7x7x512的激活层。为了达到这一目的,AlexNet使用两个4096大小的FC层,最后一个FC层使用1000个神经元来计算class的分数。我们可以将这三个FC层都转换为CONV层:
- 将第一个处理数据大小为[7x7x512]的FC层替换为使用过滤器大小F=7的CONV层,从而得到输出[1x1x4096]。
- 用CONV层替换第二个FC层,CONV层使用的过滤器大小F=1,输出为[1x1x4096]
- 同样地,用F=1替换最后一个FC层,给出最终输出[1x1x1000]
在实践中,这些转换中的每一个都可能涉及将每个FC层中的权重矩阵W变形(reshape)到CONV层滤波器中。事实证明,这种转换使我们能够在一次前向传递中,非常有效地将原始ConvNet“滑动”到更大图像中的许多空间位置。
这种转换技巧通常用于实践中,以获得更好的计算性能。例如,通常先调整图像大小使其更大,然后使用转换的ConvNet在许多空间位置评估class分数,最后求出平均的class分数。
一个Net Surgery上的IPython Notebook用代码(使用Caffe)展示了如何在实践中执行FC层到CONV层的转换。
*本博客翻译总结自CS231n课程作业网站,该网站需要翻墙才能访问。