容易被忽视的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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus