问题抛出:卷积神经网络中,当输入不是固定 size 时,如何解决?
方案 1:对输入进行 resize,统一到同一大小。
方案 2:取消全连接层,对最后的卷积层 global average polling(GAP。
方案 3:在第一个全连接层前,加入 SPP layer。本文要介绍的。
p.s. 以上方案还要实测,具体哪种方案比较好,强烈推荐方案 2,3。
以 VGG16 网络为例,如下图
vgg16 模型
现有两种规格输入:2242243 和 1801803
准备在全连接层前加入 spp net,也就是上图 77512 那一层后。
2242243:全连接层前卷积层大小 77512
1802243:全连接层前卷积层大小 55517
由于这样不同大小卷积层全连接到 114096,权值 W 是不一样的,所以 要统一全连接的输入大小。
SPP layer方法:
用不同 size,stride 的 pooling layer,对全连接层前的卷积层进行 pooling,然后做 flatten。见下图
spp layer
输入 77512 时:
pooling layer1(输出 44512): size = 7/4(向上取整)=2, stride = 7/4(向下取整)=1
pooling layer2(输出 22512): size = 7/2(向上取整)=4,stride = 7/2(向下取整)=3
pooling layer3(输出 11512): size = 7/1(向上取整)=7,stride = 7/1(向下取整)=7
然后做 flatten,输出(44+22+1)512 = 21512
输入 55512 时:
pooling layer1(输出 44512): size = 5/4(向上取整)=2, stride = 5/4(向下取整)=1
pooling layer2(输出 22512): size = 5/2(向上取整)=3,stride = 5/2(向下取整)=2
pooling layer3(输出 11512): size = 5/1(向上取整)=5,stride = 5/1(向下取整)=5
然后做 flatten,输出(44+22+1)512=21512
这样全连接层输入都是 21*512,是跟网络输入图像 size 大小无关的。