CNN基础计算卷积操作输出Feature Map的size

Posted SinHao22

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CNN基础计算卷积操作输出Feature Map的size相关的知识,希望对你有一定的参考价值。

目录

0. 前言

深度学习在计算机视觉领域的应用离不开卷积神经网络,最典型的流程是先将原始图像进行缩放等处理,然后输入网络中,经过一系列的卷积和池化操作,最后将输出的feature map拉成一个长向量,再经过全连接层将特征进行组合,最后经过softmax输出。如VGG16模型:

(图片来自网络)

卷积操作很容易理解,但是如何计算卷积后的feature map的size大小呢?其实这是一个挺基础的知识点,但我老是忘记,每次忘了再拐回去复习一下很麻烦。因此就写篇博客方便快速复习,也希望帮助到同有需求的朋友。

这里推荐一个非常棒的可视化卷积操作的网站,非常的直观!强烈建议去玩一玩!

可视化卷积操作

1. 正文

首先先明确一些符号的含义:

符号含义
N输入的feature map大小,绝大多数feature map的长宽相等,即输入的feature map大小为NxN
F卷积核(Filter)大小,为FxF
Ppadding大小
S卷积核的步长(Stride)

1.1 不考虑padding


图片来源:同济子豪兄讲解CS231N视频

在不考虑padding的情况下,输出的feature map size为:


比如当图片大小为7x7(N=7),卷积核为3X3(F=3):

当步长S=1时,outputsize = (7-3)/1 + 1 = 5;

当步长S=2时,outputsize = (7-3)/2 + 1 = 3;

当步长S=3时,outputsize = (7-3)/3 + 1 = 2.33;

1.2 考虑padding

在上面的例子中我们看到,如果不补充padding,输出的feature map的size会减小,参数减少。然而大多数情况下卷积操作要保证输入和输出的feature map的size一致,至于减少参数那是池化层(pooling)做的事情(当然也可以用stride=2的卷积层来减少参数或者使用1x1卷积进行降维处理,但这不在本次的讨论之列)。

因此实际情况下我们是需要在输入的feature map周围补一圈或好几圈padding的,比如下面的这个图就是在输入周围补一圈padding的例子(灰色部分)(P=1)


有一点提醒一下,补一圈padding的话长和宽各增加了2(不是1),补P圈padding的话长和宽各增加2P(不是P),看着上面的图就很好理解。这点很容易理解不过有时候我会忘0.0

在考虑padding时,输出的feature map size为:

1.3 卷积操作前后feature map size不变

实际情况下我们经常要保证卷积前后的feature map大小相同,比如tensorflow 2.0 就会自动保证卷积前后的feature map大小一致。那如果希望feature map在卷积前后大小不变,补充的padding应该为多少呢?


我们算出:


当步长S=1时(大多数情况下步长都为1),


即在卷积核的步长S=1时,只要在输入的周围补充(F-1)/2圈的padding,就可以保证输入和输出的feature map size一致了。

3. 总结(省流助手)

情况输出的feature map的size
不考虑padding
考虑padding
要保证输入和输出的feature map size一致
在步长S=1情况下要保证输入和输出的feature map size一致

END :)

以上是关于CNN基础计算卷积操作输出Feature Map的size的主要内容,如果未能解决你的问题,请参考以下文章

在CNN网络中roi从原图映射到feature map中的计算方法

深度学习入门基础CNN系列——感受野和多输入通道多输出通道以及批量操作基本概念

简单的CNN文本分类

CNN基础计算机如何计算卷积操作

CNN基础计算机如何计算卷积操作

CNN入门