相关论文链接:
1.Fully Convolutional Networks for Semantic Segmentation
3.SPP-Net: Deep absolute pose regression with synthetic views
卷积神经网络里输入图像大小何时是固定,何时是任意
典型的CNN架构如下:
也就是卷积层(卷积+非线性激活)+池化层+全连接层+分类层。其中,卷积层、池化层、分类层其实都不在意图像大小,但是全连接层有问题。
一般而言,全连接层的一个神经元对应一个输入。换句话说,全连接层要求固定的输入维度。而不同大小的图像,卷积模块(卷积+非线性激活+池化)输出的特征映射维度是不一样的。因此,从这个意义上说,因为有全连接层存在,决定了输入的图像的大小必须是固定的。也就是你提到的:
如果神经网络里不仅仅只有卷积层,还有全连接层,那么输入的图像的大小必须是固定的。
既然是全连接层的限制,那么,如果我们去掉全连接层,岂不就可以支持任意大小的输入图像了?也就是你提到的:
如果一个神经网络里面只有卷积层,那么我输入的图像大小是可以任意的
这正是Jonathan Long提出的FCN(Fully Convolutional Networks,全卷积网络)背后的思路,用卷积层替换全连接层。
当然,除了卷积层外,还可以用别的层替换全连接层。比如用全局平均池化(Global Average Pooling)层替换全连接层。
全局平均池化最早是由Min Lin等在网中网(Network In Network)里提出的, 其动机是为了缓解全连接层可能导致的过拟合问题。但因为全局平均池化将任意h * w * d
的张量(特征映射)转换为1 * 1 * d
的张量,因此碰巧可以自动适应不同尺寸的输入图像。之后的Inception-V3等架构借鉴了这一想法,用全局平均池化层代替全连接层,以适应不同尺寸的输入图像。
不过,也不是说只要有全连接层,输入的图像大小就一定要固定。之前提到过,固定输入图像大小的原因是:全连接层要求固定的输入维度。那么,除了像上面这样干脆用卷积层替换全连接层,还有一种思路,就是在卷积模块和全连接层之间加一个中间层,整理一下卷积模块的输出,保证不管输入图像大小怎么变,传给全连接层的始终是固定维数的输入。
Kaiming He等提出的SPP(Spatial Pyramid Pooling,空间金字塔池化)就是做这个的。
上图示意了引入SPP前后的不同流程。上为传统的CNN架构,图像(image)经过裁剪或拉伸(crop/warp)统一尺寸,再传给卷积层(conv layers);下为应用了SPP层后的架构,图像直接传给卷积层,然后经过SPP处理,统一维度,再传给全连接层(fc layers)。
上为SPP层示意图,当中的大方框表示SPP层。SPP层的输入是卷积模块输出的任意尺寸的特征映射,SPP层的输出是固定长度的表示,也就是说,SPP层将固定维度的向量传给之后的全连接层。其中,SPP层使用很多spatial bins(空间箱)对特征映射应用池化操作(比如最大池化)。空间箱的个数是固定的,大小与特征映射的尺寸(对应输入图像的尺寸)成比例,这就保证了SPP层的输出向量的维数是固定的。
个人总结如下:
1.当卷积神经网络中出现了全连接时,由于网络模型固定,因此倒推过去输入尺寸必然固定
2.全局平均池化可以将任意h×w×c的张量变为1×1×c的张量,因此可以输入任意尺寸
3.SPPNet在卷积层和全连接层之间设置中间层,将全连接层前的输入设置为满足要求,因此输入可以任何尺寸
4.论文中较为常见的是第一种