问题抛出:卷积神经网络中,当输入不是固定size时,如何解决?
方案1:对输入进行resize,统一到同一大小。
方案2:取消全连接层,对最后的卷积层global average polling(GAP。
方案3:在第一个全连接层前,加入SPP layer。本文要介绍的。
p.s.以上方案还要实测,具体哪种方案比较好,强烈推荐方案2,3。
以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。见下图
输入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大小无关的。