SPP pooling layer

参考:Spatial Pyramid Pooling in Deep Convolutional
Networks for Visual Recognition

SPP_net的提出

因为传统的CNNs网络只能接受固定size的images。实际上,卷积层可以输入任意尺度的, 但这样就会导致输出的feature map 大小不同;而InnerProduct layer 的输入必须是固定的。因此在CNNs后,InnerProduct 前加入SPP pooling layer ,使得无论输入多大的images, 经过该层后输出的feature vecture 大小都一样。虽然提出来的动机是为了解决多尺度图像的训练问题,但是,设计的SPP pooling layer 设计了几个不同的level,从而这个multi-level pooling 实际上进行了几个多个尺度的抽象。

作者在应用到分类问题上时:

进行了两种训练,一种是用单尺度图像训练,一种是多尺度图像进行训练。虽然理论上,网络可以输入任意尺度的图像,但是作者,为不同尺度的图像设定了完全相同的网络结构,并让它们共享权重,每一个epoch仅使用一个尺度的图像进行训练,然后下一次epoch 再训练另一个尺度的图像。(但是,我怎么感觉实际上就是一个网络呢,理解的还不透。。。)

作者就分类进行了如下四个方面的工作:

multi-view Testing:
在测试的时候,从原始图像(256*xxx)的中间及四个corner 提取的图像以及它们的水平flipping,进行10-view Testing,该结果能提高accuracy.
multi-size Training:
训练网络时,采用multi-size 图像进行训练,相对于single-size 的,能提高accuracy.
multi-level pooling:
训练网络时,仍采用single-size的图像进行训练,相比传统网络仅仅替换了Inner Product layer前得普通pooling layer 为SPP pooling layer, 发现multi-level pooling 能提高accuracy.
full-image representation:
采用full-image进行测试虽然没有10-view的结果好,但是比crop sample上的测试结果好,而且,把full-image及其horizontal flipping 添加到multi-view testing 中,还能进一步提高效率。
SPP pooling layer_第1张图片
简单的进行了测试,把lenet网络中的最后一个pooling替换成spp pooling layer(spp3表示3个level的pooling),看到效果还是有一点点提升的。
SPP层:
message SPPParameter {
enum PoolMethod {
MAX = 0;
AVE = 1;
STOCHASTIC = 2;
}
optional uint32 pyramid_height = 1;
optional PoolMethod pool = 2 [default = MAX]; // The pooling method
enum Engine {
DEFAULT = 0;
CAFFE = 1;
CUDNN = 2;
}
optional Engine engine = 6 [default = DEFAULT];
}

你可能感兴趣的:(深度学习论文阅读)