特征图和感受野

这篇具有很好参考价值的文章主要介绍了特征图和感受野。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

特征图和感受野是深度学习中非常重要的概念,本文将从理论和实践两个方面详细解释它们的含义和作用。

1.特征图

特征图是深度学习中常用的一种数据结构,它是卷积神经网络(CNN)中的一个重要概念。特征图是由一系列卷积核对输入图像进行卷积操作得到的结果。它可以看作是原始图像的抽象表示,其中每个像素点表示一些特定的特征。

在CNN中,特征图是网络中的中间层结果,它们可以被进一步处理和传递到后续的层中。特征图的大小和数量取决于卷积核的大小和数量,以及卷积的步长和填充方式等参数。

下面是一个简单的PyTorch代码示例,它演示了如何使用卷积层生成特征图:

import torch
import torch.nn as nn

# 定义一个简单的卷积神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        
    def forward(self, x):
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = nn.functional.relu(x)
        x = self.pool(x)
        return x

# 创建一个输入张量
x = torch.randn(1, 3, 32, 32)

# 创建网络对象
net = Net()

# 使用网络处理输入张量
output = net(x)

# 打印输出张量的形状
print(output.shape)

在上面的代码中,我们定义了一个简单的卷积神经网络,它包含两个卷积层和一个池化层。我们创建了一个3通道、32x32像素的输入张量,然后使用网络处理它。最后,我们打印输出张量的形状,可以看到它是一个4维张量,其中第一维是批次大小,第二维是通道数,第三维和第四维是特征图的高度和宽度。

2.感受野

感受野是指卷积神经网络中每个输出像素对应输入图像中的区域大小。它可以用来描述网络中每个神经元对输入图像的感知范围。感受野的大小取决于网络的层数、卷积核的大小和步长等参数。

感受野的概念对于理解CNN的工作原理和优化网络结构非常重要。如果感受野过小,网络可能无法捕捉到输入图像中的重要特征;如果感受野过大,网络可能会受到噪声和不相关信息的干扰。

下面是一个简单的PyTorch代码示例,它演示了如何计算卷积层的感受野大小:

import torch
import torch.nn as nn

# 定义一个简单的卷积神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        
    def forward(self, x):
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = nn.functional.relu(x)
        x = self.pool(x)
        return x

# 创建一个输入张量
x = torch.randn(1, 3, 32, 32)

# 创建网络对象
net = Net()

# 使用网络处理输入张量
output = net(x)

# 打印每个卷积层的感受野大小
print("Conv1: ", net.conv1.weight.size(), net.conv1.stride, net.conv1.padding, net.conv1.dilation, net.conv1.groups)
print("Conv2: ", net.conv2.weight.size(), net.conv2.stride, net.conv2.padding, net.conv2.dilation, net.conv2.groups)

在上面的代码中,我们计算了两个卷积层的感受野大小。我们可以看到,第一个卷积层的感受野大小为3x3,第二个卷积层的感受野大小为5x5。这是因为第一个卷积层的卷积核大小为3x3,步长为1,填充为1,而第二个卷积层的卷积核大小为3x3,步长为1,填充为1,再加上第一个池化层的效果,导致第二个卷积层的感受野大小为5x5。
在计算感受野大小时,需要考虑卷积核大小、步长和填充方式等参数。具体计算方法如下:

  1. 对于第一层卷积层,感受野大小等于卷积核大小。

  2. 对于后续的卷积层,假设前一层的感受野大小为D,卷积核大小为K,步长为S,填充为P,则当前层的感受野大小为:

    D’ = (D - 1) * S + K

    其中,D’为当前层的感受野大小。

  3. 对于池化层,假设前一层的感受野大小为D,池化核大小为K,步长为S,则当前层的感受野大小为:

    D’ = (D - 1) * S + K

    其中,D’为当前层的感受野大小。

下面以代码中的两个卷积层为例,计算它们的感受野大小:

  1. 对于第一个卷积层,卷积核大小为3x3,步长为1,填充为1。由于这是第一层卷积层,感受野大小等于卷积核大小,即3x3。

  2. 对于第二个卷积层,卷积核大小为3x3,步长为1,填充为1。由于第一个卷积层的感受野大小为3x3,所以当前层的感受野大小为:

    D’ = (3 - 1) * 1 + 3 = 5

    即5x5。

因此,第一个卷积层的感受野大小为3x3,第二个卷积层的感受野大小为5x5。
假设输入图像的大小为 W 1 × H 1 × D 1 W_1 \times H_1 \times D_1 W1×H1×D1,其中 W 1 W_1 W1表示图像的宽度, H 1 H_1 H1表示图像的高度, D 1 D_1 D1表示图像的深度(即通道数)。假设第一个卷积层的卷积核大小为 F 1 × F 1 F_1 \times F_1 F1×F1,步长为 S 1 S_1 S1,填充为 P 1 P_1 P1,卷积核数量为 K 1 K_1 K1。则第一个卷积层的输出特征图大小为:

W 2 = W 1 − F 1 + 2 P 1 S 1 + 1 W_2 = \frac{W_1 - F_1 + 2P_1}{S_1} + 1 W2=S1W1F1+2P1+1

H 2 = H 1 − F 1 + 2 P 1 S 1 + 1 H_2 = \frac{H_1 - F_1 + 2P_1}{S_1} + 1 H2=S1H1F1+2P1+1

D 2 = K 1 D_2 = K_1 D2=K1

其中, W 2 × H 2 × D 2 W_2 \times H_2 \times D_2 W2×H2×D2就是第一个卷积层的输出特征图的大小。

假设第一个池化层的池化核大小为 F p o o l F_{pool} Fpool,步长为 S p o o l S_{pool} Spool。则第一个池化层的输出特征图大小为:

W 3 = W 2 − F p o o l S p o o l + 1 W_3 = \frac{W_2 - F_{pool}}{S_{pool}} + 1 W3=SpoolW2Fpool+1

H 3 = H 2 − F p o o l S p o o l + 1 H_3 = \frac{H_2 - F_{pool}}{S_{pool}} + 1 H3=SpoolH2Fpool+1

D 3 = D 2 D_3 = D_2 D3=D2

其中, W 3 × H 3 × D 3 W_3 \times H_3 \times D_3 W3×H3×D3就是第一个池化层的输出特征图的大小。

假设第二个卷积层的卷积核大小为 F 2 × F 2 F_2 \times F_2 F2×F2,步长为 S 2 S_2 S2,填充为 P 2 P_2 P2,卷积核数量为 K 2 K_2 K2。则第二个卷积层的输出特征图大小为:

W 4 = W 3 − F 2 + 2 P 2 S 2 + 1 W_4 = \frac{W_3 - F_2 + 2P_2}{S_2} + 1 W4=S2W3F2+2P2+1

H 4 = H 3 − F 2 + 2 P 2 S 2 + 1 H_4 = \frac{H_3 - F_2 + 2P_2}{S_2} + 1 H4=S2H3F2+2P2+1

D 4 = K 2 D_4 = K_2 D4=K2

其中, W 4 × H 4 × D 4 W_4 \times H_4 \times D_4 W4×H4×D4就是第二个卷积层的输出特征图的大小。

因此,在这个例子中,第一个卷积层的输出特征图大小为 32 × 32 × 32 32 \times 32 \times 32 32×32×32,第一个池化层的输出特征图大小为 16 × 16 × 32 16 \times 16 \times 32 16×16×32,第二个卷积层的输出特征图大小为 16 × 16 × 64 16 \times 16 \times 64 16×16×64。可以看到,第一个池化层的作用是将特征图的大小减半,因此第二个卷积层的感受野大小为 5 × 5 5 \times 5 5×5

3.结构图

下面是结构图,它展示了一个简单的卷积神经网络的结构,包括输入、卷积层、池化层和输出:

Input (3x32x32)
|
|--> Conv1 (16x32x32)
|    |
|    |--> ReLU
|    |
|    |--> MaxPool (16x16x16)
|
|--> Conv2 (32x16x16)
|    |
|    |--> ReLU
|    |
|    |--> MaxPool (32x8x8)
|
|--> Output (32x8x8)

4.相互关系

卷积核的大小决定了卷积层的感受野大小。感受野是指在输入图像上,一个像素点对应的卷积核大小和位置所覆盖的区域。感受野的大小可以通过以下公式计算:

R i = R i − 1 + ( k i − 1 ) × S i R_{i}=R_{i-1}+(k_{i}-1)\times S_{i} Ri=Ri1+(ki1)×Si

其中, R i R_{i} Ri表示第 i i i 层的感受野大小, k i k_{i} ki表示第 i i i 层卷积核的大小, S i S_{i} Si表示第 i i i 层卷积的步长。

特征图的数量取决于卷积核的数量。在卷积层中,每个卷积核都会生成一个特征图。特征图的大小可以通过以下公式计算:

O i = I i − k i + 2 × P i S i + 1 O_{i}=\frac{I_{i}-k_{i}+2\times P_{i}}{S_{i}}+1 Oi=SiIiki+2×Pi+1

其中, O i O_{i} Oi表示第 i i i 层的特征图大小, I i I_{i} Ii表示第 i i i 层输入图像的大小, k i k_{i} ki表示第 i i i 层卷积核的大小, S i S_{i} Si表示第 i i i 层卷积的步长, P i P_{i} Pi表示第 i i i 层卷积的填充大小。

在PyTorch中,我们可以通过定义卷积层的参数来控制特征图的大小和数量。例如,以下代码定义了一个卷积层,其中卷积核大小为3,步长为1,填充为1,输出通道数为16:

import torch.nn as nn

conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)

假设输入图片的大小为 224 × 224 224 \times 224 224×224,卷积核的大小为 3 × 3 3 \times 3 3×3,卷积的步长为 1 1 1,填充方式为 1 1 1,并且共有 64 64 64 个卷积核。则经过第一层卷积后,输出的特征图大小为:

H o u t = H i n + 2 × p a d d i n g − k e r n e l _ s i z e s t r i d e + 1 = 224 + 2 × 1 − 3 1 + 1 = 224 \begin{aligned} H_{out} &= \frac{H_{in} + 2 \times padding - kernel\_size}{stride} + 1 \\ &= \frac{224 + 2 \times 1 - 3}{1} + 1 \\ &= 224 \end{aligned} Hout=strideHin+2×paddingkernel_size+1=1224+2×13+1=224

同理,输出特征图的宽度也为 224 224 224。而由于共有 64 64 64 个卷积核,因此输出的特征图数量也为 64 64 64
特征图的大小和数量对于卷积神经网络的性能和效率有着重要的影响。因此,在设计卷积神经网络时,需要根据具体任务和数据集的特点,合理地选择卷积核大小、数量、步长和填充方式等参数,以达到最佳的性能和效率。文章来源地址https://www.toymoban.com/news/detail-734505.html

到了这里,关于特征图和感受野的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习必备书籍——《Python深度学习 基于Pytorch》

    作为一名机器学习|深度学习的博主,想和大家分享几本 深度学习 的书籍,让大家更快的入手深度学习,成为AI达人!今天给大家介绍的是: 《Python深度学习 基于Pytorch》 在人工智能时代,如何尽快掌握人工智能的核心—深度学习呢?相信这是每个欲进入此领域的人面临的主

    2023年04月09日
    浏览(90)
  • 《Python深度学习基于Pytorch》学习笔记

    有需要这本书的pdf资源的可以联系我~ 这本书不是偏向于非常详细的教你很多函数怎么用,更多的是交个基本使用,主要是后面的深度学习相关的内容。 1.Numpy提供两种基本的对象:ndarray(n维数组对象)(用于储存多维数据)和ufunc(通用函数对象,用于处理不同的数据)。

    2024年02月09日
    浏览(42)
  • # Pytorch 深度卷积模型的特征可视化

    可视化模型的特征层需要打印各层的名称: 安装torchsummary包 打印各层名称

    2024年02月16日
    浏览(44)
  • 深度学习中的计算图和图优化

    深度学习中的计算图是一种用于描述和组织神经网络模型运算的图结构。计算图由节点(nodes)和边(edges)组成,节点表示操作(例如加法、乘法、激活函数等),边表示数据流向(即输入和输出)。通过计算图,我们可以清晰地了解模型中各种操作的依赖关系和计算流程,

    2024年02月16日
    浏览(45)
  • UML—时序图是什么

    目录 前言: 什么是时序图: 时序图的组成元素: 1. 角色(Actor) 2. 对象(Object) 3. 生命线(LifeLine) 4. 激活期(Activation) 5. 消息类型(Message) 6.组合片段(Combined fragment) 时序图的绘制规则:​ 绘制时序图的3步: 1.划清边界,识别交互语境 2.梳理角色和对象 3.添加消息 单点登录时序图:  总

    2024年02月06日
    浏览(81)
  • 可解释深度学习:从感受野到深度学习的三大基本任务:图像分类,语义分割,目标检测,让你真正理解深度学习

    目录   前言 一、初识感受野 1.1猜一猜他是什么? 1.2人眼视觉系统下的感受野 1.3深度神经网络中的感受野 1.3.1感受野的性质 1.3.2感受野的定义 1.3.3举一个例子 1.3.4以VGG网络为例 二、感受野的计算 2.1 哪些操作能够改变感受野? 2.2 感受野的计算公式 2.3 感受野的中心位置计算

    2024年02月02日
    浏览(57)
  • 【Python】使用Anaconda创建PyTorch深度学习虚拟环境

    使用Anaconda Prompt 查看环境: 创建虚拟环境(python3.10): 激活创建的环境: 在虚拟环境内安装PyTorch: 【Python】CUDA11.7/11.8安装PyTorch三件套_cuda 11.6对应pytorch-CSDN博客 文章浏览阅读3.3w次,点赞29次,收藏169次。安装PyTorch_cuda 11.6对应pytorch https://blog.csdn.net/ericdiii/article/details/125

    2024年01月22日
    浏览(63)
  • 深度学习基础——卷积神经网络的感受野、参数量、计算量

    深度学习在图像处理领域取得了巨大的成功,其中卷积神经网络(Convolutional Neural Networks,CNN)是一种非常重要的网络结构。本文将介绍卷积神经网络的三个重要指标:感受野、参数量和计算量。首先,会对这些指标进行定义,然后介绍如何计算它们,并通过Python实现示例代

    2024年04月28日
    浏览(43)
  • 一文理解深度学习中的多尺度和不同感受野(视野)信息

    如何理解深度学习中的多尺度和不同视野信息 在进行图像处理的深度模型中,合理理解并利用不同尺度信息和不同视野信息将对图像结果有意想不到的结果,那么具体什么是多尺度信息,什么是不同视野信息 1.不同尺度信息 多尺度是指不同尺度的信号采样,在不同尺度下可

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包