FCN理解:为什么FCN可以使输入的图像大小可以是任意的

知乎问题
https://www.zhihu.com/question/56688854
为什么说如果一个神经网络里面只有卷积层,那么我输入的图像大小是可以任意的。但是如果神经网络里不仅仅只有卷积层,还有全连接层,那么输入的图像的大小必须是固定的。

  • 卷积层的参数和输入大小无关,它仅仅是一个卷积核在图像上滑动,不管输入图像多大都没关系。图像进行卷积的时候,因为每一个卷积核中权值都是共享的,因此无论输入图像的尺寸是多大的都可以都是按照步长滑动做卷积,只不过都是经过卷积运算,不同大小的输入图片提取出的卷积特征的大小也是不同的。
  • 但全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来。(如果网络中含有全连接层的话。现在假设之前输入的图像都是一样大小的,经过卷积得到特征的尺寸也都是相同的,比如说是a×b,之后接一个1×c的全连接层,那么你现在卷积层的输出与全连接层之间的权重矩阵的大小为(a×b)×c.但是现在你如果你输入了一张比原来输入大的图像,这个时候你得卷积输出会为a‘×b’,如果它还要和全连接层相连接的话,权重矩阵的大小为(a‘×b’)×c,很明显与原来的权重矩阵不一样大,所以也就无法使用和训练了)

一篇讲的很好的全卷积网络 FCN 详解
http://www.cnblogs.com/gujianhan/p/6030639.html

FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。
FCN理解:为什么FCN可以使输入的图像大小可以是任意的_第1张图片

CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高,这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。
传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:

  • 存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。
  • 计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
  • 像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。

FCN理解:为什么FCN可以使输入的图像大小可以是任意的_第2张图片

FCN理解:为什么FCN可以使输入的图像大小可以是任意的_第3张图片

你可能感兴趣的:(FCN理解:为什么FCN可以使输入的图像大小可以是任意的)