Spatial Pyramid Pooling 详解

问题抛出:卷积神经网络中,当输入不是固定size时,如何解决?

方案1:对输入进行resize,统一到同一大小。

方案2:取消全连接层,对最后的卷积层global average polling(GAP。

方案3:在第一个全连接层前,加入SPP layer。本文要介绍的。

p.s.以上方案还要实测,具体哪种方案比较好,强烈推荐方案2,3。


以VGG16网络为例,如下图

Spatial Pyramid Pooling 详解_第1张图片
vgg16 模型

现有两种规格输入:224*224*3和180*180*3

准备在全连接层前加入spp net,也就是上图7*7*512那一层后。

224*224*3:全连接层前卷积层大小7*7*512

180*224*3:全连接层前卷积层大小5*5*517

由于这样不同大小卷积层全连接到1*1*4096,权值W是不一样的,所以 要统一全连接的输入大小。

SPP layer方法:

用不同size,stride的pooling layer,对全连接层前的卷积层进行pooling,然后做flatten。见下图

Spatial Pyramid Pooling 详解_第2张图片
spp layer

输入7*7*512时:

pooling layer1(输出4*4*512): size = 7/4(向上取整)=2, stride = 7/4(向下取整)=1

pooling layer2(输出2*2*512): size = 7/2(向上取整)=4,stride = 7/2(向下取整)=3 

pooling layer3(输出1*1*512):  size = 7/1(向上取整)=7,stride = 7/1(向下取整)=7

然后做flatten,输出(4*4+2*2+1)*512 = 21*512

输入5*5*512时:

pooling layer1(输出4*4*512): size = 5/4(向上取整)=2, stride = 5/4(向下取整)=1

pooling layer2(输出2*2*512): size = 5/2(向上取整)=3,stride = 5/2(向下取整)=2

pooling layer3(输出1*1*512):  size = 5/1(向上取整)=5,stride = 5/1(向下取整)=5

然后做flatten,输出(4*4+2*2+1)*512=21*512


这样全连接层输入都是21*512,是跟网络输入图像size大小无关的。

你可能感兴趣的:(Spatial Pyramid Pooling 详解)