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

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

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

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

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

    以 VGG16 网络为例,如下图

    Spatial Pyramid Pooling(SPP) 详解 - 图1

    vgg16 模型

    现有两种规格输入:2242243 和 1801803

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

    2242243:全连接层前卷积层大小 77512

    1802243:全连接层前卷积层大小 55517

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

    SPP layer方法:

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

    Spatial Pyramid Pooling(SPP) 详解 - 图2

    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 大小无关的。

    https://www.jianshu.com/p/e36aef9b7a8a