[Conv][Pool]实现原理

之前一直觉得卷积层和池化层的计算如下所示:

n_{out} = (n_{in}−F+2P)/S+1 (卷积层)\\ n_{out} = (n_{in}−F)/S+1 (池化层)
  • n_{out}表示输出维度的特征数
  • n_{in}表示输入维度的特征数
  • F表示卷积核大小
  • P表示零填充大小
  • S表示步长

最近发现PyTorch并没有严格按照上述公式实现,其实现参考A guide to convolution arithmetic for deeplearnin2.4节以及第3节所示

n_{out} = \left \lfloor \frac {n_{in} + 2p - k}{s} \right \rfloor + 1 (卷积层)
n_{out} = \left \lfloor \frac {n_{in} - k}{s} \right \rfloor + 1 (池化层)

使用了一个向下取整(floor)计算,所以在PyTorch实现中,不同输入大小(比如224227)能够得到相同大小的输出

PyTorch关于卷积层和池化层的实现参考: