python项目|全卷积神经网络(FCN)和卷积神经网络(CNN)的主要区别

卷积神经网络主要由卷积层、池化层和全连接层组成。排在前面的较浅的卷积层采用较小的感知域,可以学到图像的一些局部特征(如纹理特征),排在后面较深的卷积层采用较大的感知域,可以学到更加抽象的特征(如物体的大小、位置和方向等)。
全卷积神经网络(FCN)和卷积神经网络(CNN)的主要区别在于FCN将CNN末尾的全连接层转化成了卷积层。
例如,经过卷积、池化后,图像的大小变为4(长)×4(宽)×512(通道数)。CNN将图像送入全连接层,而FCN将图像送入1×1的卷积层。
python项目|全卷积神经网络(FCN)和卷积神经网络(CNN)的主要区别
文章图片

如图所示,对于100分类问题。
CNN网络将卷积、池化后的图像先进行扁平化处理,得到一维的4×4×512向量,将其送入全连接层中进行训练,最终得出分类结果。
FCN网络将全连接层改为全卷积层,先使用1024个4×4卷积核卷积得到1维的1024向量,在使用通道数为1000的1×1卷积核将向量降维至100,得出分类结果。
【卷积层直接用padding=0,4096个卷积核对应4096个神经元,参数量和之前完全等价】
我们考虑如下几个问题:
为什么用全连接,用什么去替换全连接。网络的目的是什么?
卷积神经网络的目的是提取特征、学习特征进行图像分类、目标识别、自然语言处理、预测等;
我们都知道卷积层后的全连接目的是将卷积输出的二维特征图(feature map)转化成(N*1)一维的一个向量
因为传统的卷积神经网络的输出都是分类(一般都是一个概率值),也就是几个类别的概率甚至就是一个数——类别号,那么全连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。
根据全连接的目的,我们完全可以利用卷积层代替全连接层,在输入端使用M×M大小的卷积核将数据“扁平化处理”,在使用1×1卷积核对数据进行降维操作,最终卷积核的通道数即是我们预测数据的维度。
这样在输入端不将数据进行扁平化处理,还可以使得图片保留其空间信息。
【全连接的参数实在是太多了,你想这张图里就有201212100个参数,前面随便一层卷积,假设卷积核是77的,厚度是64,那也才7764,所以现在的趋势是尽量避免全连接,目前主流的一个方法是全局平均值。也就是最后那一层的feature map(最后一层卷积的输出结果),直接求平均值。有多少种分类就训练多少层,这十个数字就是对应的概率或者叫置信度。】
使用全卷积层的优点是什么?
【python项目|全卷积神经网络(FCN)和卷积神经网络(CNN)的主要区别】全卷积层能够兼容不同大小的尺寸输入。
与global avg pooling类似,可以大大减少网络参数量
假如现在我们有一个对cifar10数据集训练好的模型(五层卷积、每层卷积后接一层池化,后接两层全连接)
我们知道,cifar10数据集中输入图像32×32×3经过5层(2×2)池化之后,变为长和宽变为1×1。
在测试阶段,现在我们有一组图像,若输入大小也是32×32×3,则可以直接用上述训练好的模型进行测试。(卷积层输入到全连接层是等价的)。
若我们输入的图像Q的长宽不是(32×32)而比32大,那么它卷积网络输出就是一个feature map,即不是一个向量,若原来是1×1×64,现在是2×2×64。那输入到全连接后就是一个四维向量了。4×4×1000,每一个channel代表一个类别。每一个通道都是4×4,我对每一个通道进行全局平均池化,每一个通道求和,这样4×4就变成了一个数。将图像水平翻转一下,再训练一遍。

    推荐阅读