news 2026/10/23 1:40:09

【功能性模块】功能性模块: (4)感受野计算:疑惑中。。。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【功能性模块】功能性模块: (4)感受野计算:疑惑中。。。

功能性模块:(4)感受野计算:疑惑中。。。

一、模块介绍

使用深度学习的小伙伴,相信对感受野这个概念肯定是不会陌生的,当时使用比较大尺寸的卷积核还是使用比较小的卷积核还引发了一系列的讨论,一层网络的感受野还是非常容易计算的,但是整个网络结构的感受野要怎么计算呢?
其实对于本文中涉及到计算感受野的方式LZ也是比较有疑惑的,如果小伙伴有自己的理解,欢迎给LZ留言,一起探讨一下!

LZ主要参考的文章是这一篇A guide to receptive eld arithmetic for Convolutional Neural Networks,所以图片基本上也来自这篇文章。

这个LZ自己需要储备下,所以就按照文章的内容讲的稍微详细些吧。

这是文中说的两种显示感受野的方式,在这两个例子中,假设原始打输入图像是5x5,卷积核的尺寸为3x3,padding的尺寸为1x1,stride打大小为2x2,这样我们进行一次卷积操作,就可以得到3x3的特征图,也就是下面示意图中中间层(用绿色进行表示),再重复一次卷积操作,就可以得到2x2的特征图,在图中用橙色进行表示。我们可以从下图直观的看出绿色feature map上每个像素的感受野对应原图上3x3的区域,橙色feature map对应到原始原图上7x7的区域。

此时需要暂停1s,小伙伴们有没有什么疑惑?

没错,就是橙色feature map上每个像素上面的感受野都已经超过了输入的原图大小,那样我们计算感受野的方式是否合理呢?现在才只有两层,如果输入224x224,计算出感受野为7x7好像也是可以接受的。

对应已知输入大小,卷积核的尺寸,padding的尺寸,stride的大小,我们就可以按照下方的公式得到对应输出特征图的大小


感受野计算公式:

  • nnn:特征图的大小,这里其实默认都是正方形的
  • sss:stride的尺寸
  • ppp:padding的尺寸
  • kkk:卷积核的大小
  • rrr:感受野的尺寸,当前输入特征图的感受野,如果是输入图像,这里应该就是1
  • jjj:相邻两个特征图的距离,这是什么意思呢?就是在feature map上相邻两个像素,对应原图输入是相隔几个像素的值
  • startstartstart:start坐标相当于输入图像的坐标系,如果是输入图像,那么应该是(0.5,0.5)

二、代码实现

# [filter size, stride, padding]# Assume the two dimensions are the same# Each kernel requires the following parameters:# - k_i: kernel size# - s_i: stride# - p_i: padding (if padding is uneven, right padding will higher than left padding; "SAME" option in tensorflow)## Each layer i requires the following parameters to be fully represented:# - n_i: number of feature (data layer has n_1 = imagesize )# - j_i: distance (projected to image pixel distance) between center of two adjacent features# - r_i: receptive field of a feature in layer i# - start_i: position of the first feature's receptive field in layer i (idx start from 0, negative means the center fall into padding)importmathdefoutFromIn(conv,layerIn):n_in=layerIn[0]j_in=layerIn[1]r_in=layerIn[2]start_in=layerIn[3]k=conv[0]s=conv[1]p=conv[2]n_out=math.floor((n_in-k+2*p)/s)+1actualP=(n_out-1)*s-n_in+k pR=math.ceil(actualP/2)pL=math.floor(actualP/2)j_out=j_in*s r_out=r_in+(k-1)*j_in start_out=start_in+((k-1)/2-pL)*j_inreturnn_out,j_out,r_out,start_outdefprintLayer(layer,layer_name):print(layer_name+":")print("\t n features: %s \n \t jump: %s \n \t receptive size: %s \t start: %s "%(layer[0],layer[1],layer[2],layer[3]))defComputeReceptiveField(imsize,convnet,layer_names):# first layer is the data layer (image) with n_0 = image size; j_0 = 1; r_0 = 1; and start_0 = 0.5print("-------Net summary------")layerInfos=[]currentLayer=[imsize,1,1,0.5]printLayer(currentLayer,"input image")foriinrange(len(convnet)):currentLayer=outFromIn(convnet[i],currentLayer)layerInfos.append(currentLayer)printLayer(currentLayer,layer_names[i])print("------------------------")if__name__=='__main__':# toy experimentsimsize=5convnet=[[3,2,1],[3,2,1]]layer_names=['conv1','conv2']print("len of convnet: ",len(convnet))print("len of layer_names: ",len(layer_names))ComputeReceptiveField(imsize,convnet,layer_names)

输出是这样的:

其中这个计算也只能是粗略的计算对应的感受野,如果加上pad操作的话,那么原图会扩充的很大,这个感受野计算的意义也就没那么大了,并且原始图像的像素对多次卷积后的特征图中的像素贡献是不一样的,那么具体贡献衰减到什么程度,就可以不进行计算呢?这个确实还需要考虑!

参考

  1. A guide to receptive eld arithmetic for Convolutional Neural Networks
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 1:38:37

【工程与环境】CASE SOLVED: ubuntu16.04 搜狗拼音中文乱码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:38:24

Docker Buildx实战:从x86构建ARM64镜像与多架构部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:36:39

设备OEE分析三步法:找损失、拆原因、定改善动作实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:36:29

纯VC++手绘虚拟仪表控件:GDI双缓冲+参数化刻度实现

简介:本资源是一个基于VC开发的虚拟仪表控件实现项目,面向工业自动化、汽车电子及嵌入式UI开发领域的中高级C工程师与MFC开发者,解决专业级数据可视化控件复用难题。项目完整封装了可拖拽集成的MFC仪表控件,支持指针动态平滑移动、…

作者头像 李华
网站建设 2026/10/23 1:35:11

PC跑EtherCAT不稳定?根源在Windows网络栈与NPCAP旁路机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华