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 |
P | padding大小 |
S | 卷积核的步长(Stride) |
1.1 不考虑padding
在不考虑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中的计算方法