pytorch中nn.Conv2d详解及参数设置原则

news2025/1/7 5:25:46

文章目录

  • 基础参数
      • 1. `in_channels` (输入通道数)
      • 2. `out_channels` (输出通道数)
      • 3. `kernel_size` (卷积核大小)
      • 4. `stride` (步幅)
      • 5. `padding` (填充)
      • 6. `dilation` (膨胀)
      • 7. `groups` (分组卷积)
      • 8. `bias` (偏置)
  • 如何设置参数?
      • 1. **`in_channels` 和 `out_channels`(输入通道数和输出通道数)**
      • 2. **`kernel_size`(卷积核大小)**
      • 3. **`stride`(步幅)**
      • 4. **`padding`(填充)**
      • 5. **`dilation`(膨胀卷积)**
      • 6. **`groups`(分组卷积)**
      • 7. **`bias`(偏置)**
      • 总结


基础参数

1. in_channels (输入通道数)

  • 定义:表示输入图像的通道数。例如,RGB图像的输入通道数为 3(红色、绿色和蓝色),灰度图像的输入通道数为 1。
  • 作用:指定输入数据的深度。卷积操作会针对每个通道应用滤波器。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)

在这个例子中,in_channels=3 表示输入是一个 RGB 图像(每个图像有 3 个通道),out_channels=64 表示卷积层会生成 64 个特征图。

2. out_channels (输出通道数)

  • 定义:表示卷积层的输出通道数,也就是卷积操作产生的特征图的数量。每个通道是由卷积滤波器生成的。
  • 作用:决定卷积层生成多少个特征图。out_channels 值越大,生成的特征图数量越多,网络的表达能力可能越强,但计算量也会增加。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)

在这个例子中,out_channels=64 表示卷积操作后生成 64 个特征图。

3. kernel_size (卷积核大小)

  • 定义:卷积核(滤波器)的大小,通常是一个正方形(例如 3x3 或 5x5)。它决定了每次卷积操作涉及的像素区域大小。
  • 作用:卷积核大小直接影响感受野(即每个卷积操作关注的区域)。卷积核越大,每个特征图表示的区域越广,但计算量也越大。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)

在这个例子中,kernel_size=3 表示卷积核的大小是 3x3。每次卷积操作会选择 3x3 的区域进行处理。

4. stride (步幅)

  • 定义:步幅控制卷积操作时卷积核滑动的步长。步幅通常是正整数,表示卷积核每次移动的像素数量。
  • 作用:步幅影响输出特征图的尺寸。步幅越大,输出特征图的尺寸越小(因为卷积核每次移动得更远)。通常,步幅为 1 时,卷积核每次移动一个像素,步幅为 2 时,卷积核每次移动两个像素。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=2)

在这个例子中,stride=2 表示卷积核每次滑动 2 个像素,因此输出特征图的宽度和高度都将减半。

5. padding (填充)

  • 定义:填充是指在输入图像的边缘添加额外的像素。它的作用是确保卷积操作可以处理边缘的像素,同时可以控制输出特征图的尺寸。
  • 作用:填充可以保持输入和输出的尺寸相同(当步幅为 1 时)。常见的填充方式包括:
    • padding=1:表示在每个边上添加 1 个像素的填充。
    • padding='same':常见的用法,在很多框架中使用,表示填充的大小使得输入和输出的尺寸相同。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)

在这个例子中,padding=1 表示在输入图像的每个边上添加 1 个像素的填充,这样可以保持输出特征图的尺寸与输入图像相同(当步幅为 1 时)。

6. dilation (膨胀)

  • 定义:膨胀卷积是对卷积核应用间隔的技术,卷积核之间的元素不再是连续的,而是通过空洞来分隔。
  • 作用:膨胀卷积的作用是扩展感受野,能够捕捉更大的上下文信息,而不会增加参数量或计算量。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, dilation=2)

在这个例子中,dilation=2 表示卷积核的元素之间间隔为 2,使得感受野扩大,但卷积核的实际大小保持不变。

7. groups (分组卷积)

  • 定义:分组卷积通过将输入通道分成若干组来实现卷积计算。每一组的卷积核只会对属于该组的输入通道进行卷积操作。
  • 作用:分组卷积可以减少计算量,并且在某些任务中(如深度可分离卷积)有助于提升网络性能。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, groups=3)

在这个例子中,groups=3 表示输入的 3 个通道会被分成 3 组,每组一个卷积核进行卷积操作。这样,卷积层的计算量减少。

8. bias (偏置)

  • 定义:偏置是卷积操作中的一个可学习参数。它会被加到每个卷积结果上,用于调整输出。
  • 作用:在卷积操作之后加上偏置,可以帮助模型更好地拟合训练数据。通常情况下,卷积层会默认有偏置,但可以通过设置 bias=False 来禁用。

实例

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, bias=True)

在这个例子中,bias=True 表示卷积层会包含偏置。


如何设置参数?

1. in_channelsout_channels(输入通道数和输出通道数)

  • in_channels 由输入数据决定。例如,RGB 图像的 in_channels 为 3,灰度图像的 in_channels 为 1。通常在图像输入层,in_channels 是已知的。
  • out_channels 是一个非常重要的超参数,它影响网络的表达能力和计算量。增加 out_channels 可以增加网络的表达能力,但同时也会增加计算量和内存消耗。输出通道数的选择通常依赖于以下几个因素:
    • 任务复杂度:对于复杂的任务(如图像分类、目标检测),较大的 out_channels 值可以帮助网络学习更丰富的特征。
    • 网络深度:较深的网络可以逐步增加 out_channels,从而提高特征的抽象能力。
    • 计算资源:较大的 out_channels 会增加计算量,因此需要考虑计算资源和推理速度。

实例
对于图像分类任务,通常在第一层使用较小的 out_channels(如 64 或 128),然后在后续层逐步增加(如 256、512 等)。

conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)
conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3)

2. kernel_size(卷积核大小)

  • 卷积核大小(如 3x3 或 5x5)决定了每次卷积操作所查看的图像区域。
  • 3x3 卷积核 是最常用的选择,它在很多现代网络架构中表现出色,原因是:
    • 计算效率:相对于较大的卷积核(如 5x5、7x7),3x3 卷积核可以通过堆叠多个层来扩展感受野,从而节省计算量。例如,两个 3x3 的卷积核可以实现与 5x5 卷积核相同的感受野,但计算量较小。
    • 深度卷积结构:3x3 卷积核有助于建立深度网络结构,通过多个层级来学习复杂的特征。
  • 大卷积核(如 5x5 或 7x7) 通常用于初始层,尤其是当输入图像非常大时,可以一次性捕获更多的空间信息。

实例

  • 如果网络较浅,可以使用较大的卷积核来捕捉较大的特征。
  • 在深度网络中,可以使用 3x3 卷积核,堆叠多个卷积层来逐步提取更高阶的特征。
conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)  # 常见的3x3卷积
conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=5)  # 较大的卷积核

3. stride(步幅)

  • 步幅决定了卷积核滑动的速度,影响输出特征图的尺寸。步幅越大,输出特征图的尺寸越小。
  • 在下采样(如池化)时,通常会选择步幅为 2,以减少特征图的尺寸并增加感受野。
  • 对于大部分应用,步幅通常设置为 1,特别是在中间层,用于精细提取特征;而在初始层或下采样层,步幅可以设置为 2。

实例

  • 如果希望减少输出特征图的尺寸,可以设置步幅为 2,例如在下采样阶段。
  • 如果需要更精细的特征提取,步幅通常设置为 1。
conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=2)  # 下采样
conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1)  # 特征提取

4. padding(填充)

  • 填充可以在输入图像的边缘添加额外的像素,避免卷积操作导致的尺寸缩小。合理设置填充有助于保持特征图的尺寸,尤其是在步幅为 1 时。
  • same 填充:当步幅为 1 时,使用填充可以保证输入和输出的尺寸相同。常见的做法是根据卷积核的大小自动计算填充量,以保持尺寸不变。
  • 在较深的网络中,通常使用填充保持特征图的空间尺寸,避免在多个卷积层中丢失过多的空间信息。

实例

  • 如果想要输入和输出具有相同的空间尺寸,可以使用 padding=1 对于 3x3 卷积核。
  • 如果希望特征图缩小,可以减少填充量,或者不使用填充。
conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)  # 输出尺寸不变
conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=0)  # 输出尺寸缩小

5. dilation(膨胀卷积)

  • 膨胀卷积通过增加卷积核元素之间的间隔来扩大感受野,通常用于捕捉长距离依赖。
  • 在任务中,如果需要捕捉较大的上下文信息(例如语义分割、目标检测),可以使用膨胀卷积来增加感受野而不增加计算量。

实例

  • 在语义分割中,膨胀卷积常用于提取更大范围的上下文信息。
conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, dilation=2)  # 膨胀卷积

6. groups(分组卷积)

  • 分组卷积通过将输入分成多个组进行卷积,可以有效减少计算量和内存消耗,常见于 深度可分离卷积(depthwise separable convolutions)。
  • 分组卷积有助于减少参数数量,同时还可以增加网络的计算效率,特别是在移动端或资源受限的设备上。

实例

  • 在移动端模型(如 MobileNet)中,通常使用分组卷积来减少计算量。
conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, groups=3)  # 分组卷积

7. bias(偏置)

  • 在大多数情况下,卷积层的偏置是启用的(bias=True),这有助于网络学习更灵活的偏移量。仅在特殊情况下才禁用偏置,如批量归一化层后面。

实例

  • 默认情况下,bias=True 是常见的设置。
conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, bias=True)

总结

设计卷积神经网络时,合理选择这些参数需要结合实际需求:

  • 对于 简单任务,可以选择较小的输出通道数和标准的 3x3 卷积核。
  • 对于 复杂任务,可以使用较大的输出通道数和堆叠多个卷积层。
  • 使用 步幅填充 控制特征图的尺寸变化,保持适当的空间信息。
  • 资源受限的环境 中,可以选择分组卷积和膨胀卷积来减少计算量。

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

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

相关文章

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…

DevSecOps自动化在安全关键型软件开发中的实践、Helix QAC Klocwork等SAST工具应用

DevSecOps自动化对于安全关键型软件开发至关重要。 那么,什么是DevSecOps自动化?具有哪些优势?为何助力安全关键型软件开发?让我们一起来深入了解~ 什么是DevSecOps自动化? DevSecOps自动化是指在软件开发生命周期的各…

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 数据准备&#x…

小程序学习06——uniapp组件常规引入和easycom引入语法

目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范: 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 (a)新建compoents文件…

股市学习 seekingalpha tradingview

EMA EMA(Exponential Moving Average)是一种技术分析中常用的指标,用于平滑股价或其他资产价格的波动,以帮助分析价格走势的趋势和方向。EMA与简单移动平均(SMA)类似,但对最新价格的权重更大&a…

【办公类-47-02】20250103 课题资料快速打印(单个docx转PDF,多个pdf合并一个PDF 打印)

背景需求: 2023区级大课题《运用Python优化3-6岁幼儿学习活动材料的实践研究》需要做阶段资料 本来应该2024年6月就提交电子稿和打印稿。可是python学具的教学实验实在太多了,不断生成,我忙着做教学,都没有精力去整理。 2025年…

unity学习4:git和SVN的使用差别

目录 1 svn 1.1 操作逻辑 1.2 对应工具 1.3 SVN避免冲突的好习惯 2 git 2.1 git的基础操作逻辑 2.1.1 commit时,提交文件之外的其他文件需要pull 2.1.2 commit时,发现要提交的本地文件和服务器的文件冲突了 2.1.3 pull 时 2.2 对应工具 2.3 …

【数据库初阶】MySQL数据类型

🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL…

kubernetes学习-Service

kubernetes学习-Service 1. Service说明2. 功能3.Service类型3.1 NodePort3.1.1 创建web-service.yaml3.1.2 创建web-pod.yaml3.1.3 部署3.1.4 验证 3.2 ClusterIP3.2.1 创建web-clusterIp-service.yaml3.2.2 创建web-clusterIp-pod.yaml3.2.3 部署3.2.4 验证 3.3 LoadBalancer…

滤波器的主要参数

为什么选择高阶: 滤波器的主要参数通常包括以下几个方面: 截止频率 (Cutoff Frequency): 这是滤波器能够有效通过或抑制信号的频率点。对于低通滤波器,信号低于截止频率的部分会被通过,高于截止频率的部分会被衰减。高…

设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保某个类在应用程序的生命周期内只有一个实例,并提供一个全局访问点来获取该实例。这种设计模式在需要控制资源访问、避免频繁创建和销毁对象的场景中尤为有用。 一、核心…

290-3U VPX i7 刀片计算机

一、产品概述 该产品是一款基于第三代Intel i7双核四线程的高性能3U VPX刀片式计算机。产品提供了多个高速PCIe总线接口,其中3个x4 PCIe 3.0接口,1个x4 PCIe 2.0接口。x4 PCIe 2.0接口可灵活配置为4个x1 PCIe接口,因此产品具有很强的扩展性&a…

【从零开始入门unity游戏开发之——C#篇41】C#迭代器(Iterator)——自定义类实现 foreach 操作

文章目录 前言一、什么是迭代器?二、标准迭代器的实现方法1、自定义一个类CustomList2、让CustomList继承IEnumerable接口3、再继承IEnumerator接口4、完善迭代器功能5、**foreach遍历的本质**:6、在Reset方法里把光标复原 三、用yield return语法糖实现…

win32汇编环境,对话框程序中通过资源显示bmp图像

;运行效果 ;win32汇编环境,对话框程序中通过资源显示bmp图像 ;通过资源的方式,会把图像固定在exe文件里,会变大。通过读取文件的方式,没有固定在exe文件里,也可以随时换图像文件,所以exe文件较小 ;直接抄进RadAsm可编译…

MATLAB画柱状图

一、代码 clear; clc; figure(position,[150,100,900,550])%确定图片的位置和大小,[x y width height] %准备数据 Y1[0.53,7.9,8.3;0.52,6.8,9.2;0.52,5.9,8.6;2.8,5.8,7.9;3.9,5.2,7.8;1.8,5.8,8.4]; % withoutNHC X11:6; %画出4组柱状图,宽度1 h1…

java 搭建一个springboot3.4.1项目 JDK21

环境准备 idea:2021 springboot:3.4.1 JDK:21 maven:3.6.3 新建项目 点击new->project->spring initializr 选择springboot版本 1.选择springboot版本,因为JDK版本是21因此对应springboot3.X Spring Boot 2.6.x:适用于JDK 8到17&#xff0c…

第R3周:RNN-心脏病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 一、前言二、代码流程1、导入包,设置GPU2、导入数据3、数据处理4、构建RNN模型5、编译模型6、模型训练7、模型评估 电脑环境:…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读: 多点 DMALL 成立于2015年,持续深耕零售业,为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座,大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和…