spp为何凯明2015年提出的池化结构,以解决在此之前卷积神经网络只能输入固定大小图片的结果
相比于传统的cnn网络,spp主要是在全连接层之前嵌入,保证输入的维度大小一定,避免了不同大小的输入尺寸对结果的影响,并且spp池化层的加入显著提高了在此之前的部分CNN模型以及目标检测的RCNN模型中取得了显著的进步
不同于单纯使用平均池化或者最大池化,对卷积层最后的输出(batch,N通道数,w宽度,h高度)分别用三个最大池化层获得(batch,N,4,4),(batch,N,2,2),(batch,N,1,1)三层,并共同输入fc全连接层,获得(batch,16+4+1,w*h)大小的数据输入fc层。可以理解为使用了三种卷积核(池化窗口)提取特征,以获得固定大小特征输入全连接层
实际应用中可以对比参考选择三个尺寸的池化层。
以下为一个demo:
import torch
import torch.nn as nn
import math
def _spp_pool(in_h,in_w,out_hc,out_wc):
#H_out=(H_in-F+2P)/S+1
F_h=int(math.ceil(in_h/out_hc))
F_w=int(math.ceil(in_w/out_wc))
S_h=F_h
S_w=F_w
P_h=(F_h-1)*S_h+F_h-in_h
P_w=(F_w-1)*S_w+F_w-in_w
return nn.MaxPool2d((F_h,F_w),(S_h,S_w),(P_h,P_w))
#x.view(,-1)
#torch.cat()