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

0. 前言

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

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

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

可视化卷积操作

1. 正文

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

符号 含义
N 输入的feature map大小,绝大多数feature map的长宽相等,即输入的feature map大小为NxN
F 卷积核(Filter)大小,为FxF
P padding大小
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 :)

猜你喜欢

转载自blog.csdn.net/qq_44166630/article/details/123966786