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

2023-10-08 21:01

本文主要是介绍容易被忽视的CNN模型的感受野及其计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

感受野可能是卷积神经网络中最重要的概念之一,在学术中也被广泛关注。几乎所有的目标检测方法都围绕感受野来设计其模型结构。这篇文章通过可视化的方法来表达感受野的信息,并且提供一用于计算任何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 = 5def 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) + 1actualP = (n_out-1)*s - n_in + k pR = math.ceil(actualP/2)pL = math.floor(actualP/2)j_out = j_in * sr_out = r_in + (k - 1)*j_instart_out = start_in + ((k-1)/2 - pL)*j_inreturn n_out, j_out, r_out, start_outdef 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.5print ("-------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: 5jump: 1receptive size: 1       start: 0.5
conv1:n features: 3jump: 2receptive size: 3       start: 0.5
conv2:n features: 2jump: 4receptive 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)

这篇关于容易被忽视的CNN模型的感受野及其计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167967

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu