容易被忽视的CNN模型的感受野及其计算

news2024/10/6 10:41:00

感受野可能是卷积神经网络中最重要的概念之一,在学术中也被广泛关注。几乎所有的目标检测方法都围绕感受野来设计其模型结构。这篇文章通过可视化的方法来表达感受野的信息,并且提供一用于计算任何CNN网络每一层感受野的程序。

对于CNN相关的基础知识,可以参考A guide to convolution arithmetic for deep learning。

首先看一下感受野的定义,感受野是指在输入特征图上影响某一个特定的特征层上某一个具体的特征的区域。一个特征的感受野可以用其中心位置尺寸来描述。如下图1所示,


在feature 2上圆圈圈出的特征,对应到feature 1上是一块3x3的区域影响此特征,所以feature 2 layer的感受野大小是3。

下图2描述了一个感受野的例子。我们使用 5 ∗ 5 5*5 55的输入特征图,卷积核大小 k = 3 ∗ 3 k=3*3 k=33,padding p = 1 p=1 p=1,stride s = 2 ∗ 2 s = 2*2 s=22的卷积核。根据A guide to convolution arithmetic for deep learning中提供的公式计算得到输出特征图的尺寸为3x3。然后继续在此特征图上使用相同的卷积核执行卷积操作,得到2x2的特征图。

其中,

i i i:输入特征图的尺寸

p p p:padding size

k k k:kernel size

s s s:stride size

下图3左侧的图展示的是常规的CNN不同特征图之间的展示方法,但是这种方法比较难以看出感受野的中心坐标,也比较难看出感受野的大小。上图右侧的图每个feature map使用了与input相同的大小来表示,然后经过卷积后的特征图使用稀疏的表示方式来表达。这种表达方式可以清楚的看到感受野的中心位置和感受野的大小。例如上图右侧图中,绿色的特征图上的特征点的感受野大小是3,黄色特征图的感受野大小为6.

请添加图片描述

下图4所示是另一个感受野的例子,这个使用了更大的输入特征图,9x9的特征图。下图作图是3D的表示,右图是2D的表示法。我们可以看到,在第二个特征图上的特征,其感受野大小为7x7,几乎覆盖了整个输入特征图的大小。感受野越大,对于深层的CNN网络的性能越好,因此这也是网络设计需要考虑的因素。
请添加图片描述

感受野尺寸的计算公式

上面式子中,

  • 第一个公式计算的是每层输出特征图的尺寸,其中, n i n n_{in} nin表示输入特征图的尺寸, p p p表示padding size, k k k表示kernel size, s s s表示stride, n o u t n_{out} nout表示输出特征图的尺寸。

  • 第二个公式计算的是使用图2右侧的特征图表示法时,特征图上每个特征之间的jump。其等于输入特征图的jump j i n j_{in} jin乘以 s s s stride。例如下图的特征图中,每两个特征之间的jump是2.

  • 第三个公式计算的是当前输出特征图的特征所对应的感受野大小。其中, r i n r_{in} rin表示输入特征图所属特征的感受野大小, k k k表示kernel size, j i n j_{in} jin表示输入特征图每两个特征之间的jump。如下图所示,在图中,绿色特征图的 r i n = 3 , k = 3 , j i n = 2 r_{in}=3,k=3,j_{in}=2 rin=3k=3jin=2,所以黄色特征图的感受野大小为 r o u t = r i n + ( k − 1 ) ∗ j i n = 3 + 2 ∗ 2 = 7 r_{out} = r_{in} + (k-1)*j_{in} = 3 + 2 * 2 = 7 rout=rin+(k1)jin=3+22=7,与我们图上直观看到的结论一致。

请添加图片描述

  • 第四个公式计算的是感受野的中心点坐标。

下面我们用一个直观的例子来计算下整个过程。对于第一个输入特征图,总是有 n = i m a g e s i z e , r = 1 , j = 1 , s t a r t = 0.5 n = image size, r = 1, j = 1, start = 0.5 n=imagesize,r=1,j=1,start=0.5。在下图中,输入特征图的中心点在图上坐标轴的坐标为0.5。

请添加图片描述

经过最后的计算,得到最后特征图的感受野大小为7。下面我们通过程序来验证一下。

# [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)

import math
# 定义这个example的两层网络的参数,kernel size = 3, stride = 2, padding = 1
convnet =   [[3,2,1],[3,2,1]]
layer_names = ['conv1','conv2']
# 定义输入特征图的尺寸
imsize = 5

def outFromIn(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) + 1
  actualP = (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_in
  return n_out, j_out, r_out, start_out
  
def printLayer(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]))
 
layerInfos = []
if __name__ == '__main__':
#first layer is the data layer (image) with n_0 = image size; j_0 = 1; r_0 = 1; and start_0 = 0.5
  print ("-------Net summary------")
  currentLayer = [imsize, 1, 1, 0.5]
  printLayer(currentLayer, "input image")
  for i in range(len(convnet)):
    currentLayer = outFromIn(convnet[i], currentLayer)
    layerInfos.append(currentLayer)
    printLayer(currentLayer, layer_names[i])
  print ("------------------------")
  layer_name = input ("Layer name where the feature in: ")
  layer_idx = layer_names.index(layer_name)
  idx_x = int(input ("index of the feature in x dimension (from 0)"))
  idx_y = int(input ("index of the feature in y dimension (from 0)"))
  
  n = layerInfos[layer_idx][0]
  j = layerInfos[layer_idx][1]
  r = layerInfos[layer_idx][2]
  start = layerInfos[layer_idx][3]
  assert(idx_x < n)
  assert(idx_y < n)
  
  print ("receptive field: (%s, %s)" % (r, r))
  print ("center: (%s, %s)" % (start+idx_x*j, start+idx_y*j))

执行其输出为

-------Net summary------
input image:
         n features: 5
         jump: 1
         receptive size: 1       start: 0.5
conv1:
         n features: 3
         jump: 2
         receptive size: 3       start: 0.5
conv2:
         n features: 2
         jump: 4
         receptive size: 7       start: 0.5
------------------------
Layer name where the feature in: conv2
index of the feature in x dimension (from 0)0
index of the feature in y dimension (from 0)0
receptive field: (7, 7)
center: (0.5, 0.5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8 财政收入预测分析

第8章 财政收入预测分析 8.1 了解财政收入预测的背景与方法8.1.1 分析财政收入预测背景1、财政收入简介和需求2、财政收入预测数据基础情况3、财政收入预测分析目标 8.1.2 了解财政收入预测的方法8.1.3 熟悉财政收入预测的步骤与流程 8.2 分析财政收入数据特征的相关性8.2.1 了…

虚拟机模拟部署服务器

1、下载安装vmware 15 &#xff08;win7最高支持版&#xff09; 2、下载安装CentOS 配置2核2g&#xff08;最少&#xff09;磁盘100g&#xff08;不会实际占有&#xff09;选择时区配置分区 https://blog.csdn.net/qq_35363507/article/details/127390889 &#xff08;/boot …

MPLS VPN 配置

二 、知识点 MPLS VPN网络一般由运营商搭建&#xff0c;用于向不同的客户提供VPN服务&#xff0c;使得用户的路由和数据能够通过该网络进行传递&#xff0c;且不同的用户之间的路由和数据完全隔离&#xff0c;互不影响。MPLS VPN控制层面&#xff1a;通过VRF和RD隔离不同用户的…

matplotlib制图进阶版

需求&#xff1a;两个产品销量的可视化折线图 1、使用pandas读取数据 2、生成销售数量的折线图

深度图转化为点云

import numpy as np import cv2# 加载RGB图像和深度图像 rgb_image cv2.imread(rF:\Datasets\data\nyu2_test\00000_colors.png) # 假设你有一张RGB图像 depth_image cv2.imread(rF:\Datasets\data\nyu2_test\00000_depth.png, cv2.IMREAD_GRAYSCALE) # 假设你有一张灰度深…

计算机网络笔记 第三章数据链路层

3.1 数据链路层概述 数据链路层在网络体系结构中所处的地位 链路、数据链路和帧 链路 链路&#xff08;Link&#xff09;是指从一个节点到相邻节点的一段物理线路&#xff08;有线或无线&#xff09;&#xff0c;而中间没有任何其他的交换节点。 数据链路 (Data Link&#…

Python爬虫技术系列-03requests库案例-完善

Python爬虫技术系列-03requests库案例 参考1 Requests基本使用1.1 Requests库安装与使用1.1.1 Requests库安装1.1.2 Rrequests库介绍1.1.3 使用Requests一般分为三个步骤1.1.4 requests的公共方法 2 Requests库使用案例2.1 GET请求携带参数和headers2.2 POST请求&#xff0c;写…

no Go files in ...问题

golang项目&#xff0c;当我们微服务分模块开发时&#xff0c;习惯把main.go放在cmd目录下分模块放置&#xff0c;此时&#xff0c;我们在项目根目录下执行go test . 或go build . 时会报错“no Go files in ...”, 这是因为在.目录下找不到go程序&#xff0c;或者找不到程序入…

如何提升爬虫IP使用效率?精打细算的方法分享

在进行爬虫数据采集时&#xff0c;爬虫IP是不可或缺的工具。然而&#xff0c;爬虫IP的费用可能是一个爬虫项目的重要开支之一。为了帮助您节省爬虫IP经费&#xff0c;本文将分享一些经济高效的方法&#xff0c;让您在使用爬虫IP时更加节约成本&#xff0c;提高经济效益。 一、优…

Games104现代游戏引擎笔记 基础ai

游戏AI navigation(导航系统) 地图的表达形式&#xff0c; 寻路&#xff0c;路径优化 Map representation&#xff1a; 1.可行走区域&#xff08;物理碰撞&#xff0c;跳跃距离&#xff0c;攀爬高度&#xff09; 2.表达形式&#xff1a;waypoint networks(路点网络图)&#…

阿里云Alibaba Cloud Linux操作系统详细介绍_镜像常见问题解答

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

JAVA-SpringBoot入门Demo用IDEA建立helloworld

使用编辑器IDEA做SpringBoot项目最近几年比较红红&#xff0c;作为JAVA语言翻身的技术&#xff0c;用户量激增。由于java平台原来的占有率&#xff0c;相比net core在某些方面更有优势。 我把本次我下载完成后Maven项目的过程记录下来了&#xff0c;仅供参考&#xff01; 安装J…

初识Java 13-1 异常

目录 概念 基本的异常 捕获异常 try块 异常处理程序&#xff08;catch&#xff09; 创建自己的异常 异常说明&#xff08;及检查型异常&#xff09; 捕获任何异常 多重捕捉 栈轨迹 重新抛出异常 异常链 本笔记参考自&#xff1a; 《On Java 中文版》 Java的基本哲学…

【Kotlin精简】第1章 基础类型

1 Kotlin基础类型 Kotlin中&#xff0c;我们可以调用任何变量的成员函数和属性&#xff0c;从这个角度来说&#xff0c;一切皆对象。某些类型可以有特殊的内部表现。例如&#xff1a;数字、字符和布尔型在运行时可以表现为基础类型&#xff08;primitivetypes&#xff09;。 …

九章云极DataCanvas公司完成D1轮融资!

近日&#xff0c;九章云极DataCanvas公司完成总融资额3亿元D1轮融资。中国电子集团旗下中电智慧基金、华民投、中国太平旗下太平创新、浙江东方旗下东方嘉富等央国企旗下投资机构&#xff0c;以及卓源资本等专注人工智能赛道的知名财务投资机构参与本轮融资。 九章云极DataCan…

dataframe保存excel格式比csv格式小很多很多

问题描述&#xff1a; 一个3万行的数据保存成csv大概10个G&#xff0c;但保存成excel格式只有100多M 原因分析&#xff1a; 因为xlsx 实际上就是 zip 压缩包&#xff0c;同时&#xff0c;如果有大量重复的数据&#xff0c;XLSX 会提取文本值&#xff0c;将其存储在查找表中&…

APP 备案公钥、签名 MD5获取方法。

一、IOS 系统获取 Bundle ID、平台公钥、签名 MD5 值的指引 获取 Bundle ID&#xff1a;使用 APP 对应的 IOS 开发者账号登录 Developer 控制台&#xff0c;找到下图标识符&#xff08;英文&#xff09;&#xff0c;单击进入 Certificates,Identifiers&Profiles 页面。 在…

【QT5-程序控制电源-[GPIB-USB-HS]-SCPI协议-上位机-基础样例【2】】

【QT5-程序控制电源-[GPIB-USB-HS]-SCPI协议-上位机-基础样例【2】】 1、前言2、实验环境3、自我总结1、基础了解仪器控制-熟悉仪器2、连接SCPI协议3、了解GPIB-USB-HS4、软件调试-代码编写 4、熟悉协议-SCPI协议5、实验过程-熟悉软件&#xff08;1&#xff09;去官网NI&#x…

电视盒子哪个牌子最好?经销商分享热门电视盒子排名

作为数码产品经销商&#xff0c;我对电视盒子这块非常了解&#xff0c;最近看到很多人因为不懂电视盒子哪个牌子最好而踩雷&#xff0c;我根据店内的销量情况整理了电视盒子排名&#xff0c;近期想买电视盒子不想花冤枉钱可以从下面五款电视盒子中入手。 TOP 1泰捷WEBOX 40S电视…

STM32CubeIDE修改文件编码格式(解决代码注释出现乱码问题)

文章目录 问题描述解决方法STM32CubeIDE介绍 问题描述 在使用STM32CubeIDE时&#xff0c;从外部导进来的几个文件后&#xff0c;发现注释都是乱码的&#xff0c;如下图所示&#xff1a; 所以为了方便的查看注释&#xff0c;必需将乱码显示正常的中文显示&#xff1b;记录一下修…