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

0. 前言

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

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

这是一个用于可视化卷积操作的很棒的网站,非常直观!强烈建议去玩!

可视化卷积操作

1. 正文

首先,让我们澄清一些符号的含义:

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

1.1 不考虑padding

【CNN基础】计算卷积操作输出Feature Map的size
图片来源:同济子豪兄讲解CS231N视频

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

【CNN基础】计算卷积操作输出Feature Map的size
比如当图片大小为7×7(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的卷积层来减少参数或者使用1×1卷积进行降维处理,但这不在本次的讨论之列)。

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

【CNN基础】计算卷积操作输出Feature Map的size
有一点提醒一下,补一圈padding的话长和宽各增加了2(不是1),补P圈padding的话长和宽各增加2P(不是P),看着上面的图就很好理解。这点很容易理解不过有时候我会忘0.0

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

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

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

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

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

【CNN基础】计算卷积操作输出Feature Map的size
当步长S=1时(大多数情况下步长都为1),

【CNN基础】计算卷积操作输出Feature Map的size
即在卷积核的步长S=1时,只要在输入的周围补充(F-1)/2圈的padding,就可以保证输入和输出的feature map size一致了。

3. 总结(省流助手)

情况输出的feature map的size
不考虑padding【CNN基础】计算卷积操作输出Feature Map的size
考虑padding【CNN基础】计算卷积操作输出Feature Map的size
要保证输入和输出的feature map size一致【CNN基础】计算卷积操作输出Feature Map的size
在步长S=1情况下要保证输入和输出的feature map size一致【CNN基础】计算卷积操作输出Feature Map的size

END :)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年4月6日 下午12:15
下一篇 2022年4月6日 下午12:29

相关推荐