【PyTorch】PyTorch中torch.nn模块的卷积层

PyTorch深度学习总结

第七章 PyTorch中torch.nn模块的卷积层


文章目录

  • PyTorch深度学习总结
  • 前言
  • 一、torch.nn模块
    • 1. 模块的基本组成部分
      • 1.1 层(Layers)
      • 1.2 损失函数(Loss Functions)
      • 1.3 激活函数(Activation Functions)
    • 2. 自定义神经网络模型
    • 3. 模块的优势
  • 二、torch.nn模块的卷积层
    • 1. 卷积的定义
    • 2. 常见的卷积层
    • 3. 卷积层的重要参数
    • 4. 卷积层总结


前言

上文介绍了PyTorch中张量(Tensor)微分(torch.autograd)操作,现在我们以及学习完了张量的主要基本操作,本文将进入神经网络介绍。
首先,本文将介绍torch.nn模块学习(卷积层)。


一、torch.nn模块

torch.nn 是 PyTorch 中用于构建神经网络的核心模块,它提供了丰富的类和函数,方便用户定义、训练和评估神经网络模型


1. 模块的基本组成部分

1.1 层(Layers)

torch.nn 提供了多种类型的层,如卷积层、池化层、循环层、全连接层等,这些层是构建神经网络的基本单元。
例如:卷积层nn.Conv2d等)、池化层nn.MaxPool2d等)、循环层nn.rnn等)、全连接层nn.Linear等)。

1.2 损失函数(Loss Functions)

损失函数能衡量模型预测结果与真实标签之间的差异,用于指导模型的训练。
例如:交叉熵损失nn.CrossEntropyLoss)、 均方误差损失nn.MSELoss)等。

1.3 激活函数(Activation Functions)

激活函数是为神经网络引入非线性因素,使网络能够学习更复杂的函数。
例如:ReLU 激活函数(nn.ReLU)、Sigmoid 激活函数(nn.Sigmoid)等。


2. 自定义神经网络模型

通过继承 nn.Module 类,可以自定义神经网络模型。在自定义模型时,需要实现 __init__ 方法来初始化模型的层,以及 forward 方法来定义模型的前向传播过程。


3. 模块的优势

高度模块化torch.nn 模块将神经网络的各个组件进行了模块化封装,用户可以方便地组合不同的层、损失函数和激活函数,构建出复杂的神经网络模型。
自动求导:结合 PyTorch 的自动求导机制,torch.nn 模块可以自动计算模型的梯度,大大简化了模型训练的过程。
跨平台支持:基于 PyTorch 的跨平台特性,torch.nn 模块可以在 CPUGPU 等不同的计算设备上运行,提高了模型的训练和推理效率。


二、torch.nn模块的卷积层

1. 卷积的定义

卷积是一种数学运算,在信号处理、图像处理和机器学习等领域都有广泛应用。卷积公式通常用星号“*”表示卷积运算,下方展示了连续和离散两种信号的卷积计算公式。
连续时间信号 x(t)h(t) ,其卷积公式定义为:
(y∗h)(t)=∫−∞∞x(τ)h(t−τ)dτ(y * h)(t) = \int_{-\infty}^{\infty} x(\tau)h(t - \tau)d\tau (yh)(t)=x(τ)h(tτ)dτ
离散时间信号 x[n]h[n],其卷积公式定义为:
(y∗h)[n]=∑k=−∞∞x[k]h[n−k](y * h)[n] = \sum_{k = -\infty}^{\infty} x[k]h[n - k] (yh)[n]=k=x[k]h[nk]
下图展示了离散信号卷积计算过程:
卷积运算过程


2. 常见的卷积层

以下举例了torch.nn模块中常见的卷积层:

卷积层类名(torch.nn 中)用途
一维卷积nn.Conv1d主要用于处理一维序列数据,如音频信号、时间序列等。在音频处理中,可以将音频的波形信号作为输入,通过一维卷积提取不同时间步的特征。
二维卷积nn.Conv2d广泛应用于处理二维图像数据,如图像分类、目标检测、语义分割等任务。通过二维卷积可以提取图像中的边缘、纹理等特征。
三维卷积nn.Conv3d适用于处理三维数据,如视频数据(包含时间维度)、医学影像(如 CT 扫描数据)等。在视频分析中,可提取视频在时间和空间上的特征。
转置卷积(反卷积)nn.ConvTranspose2d常用于将低分辨率的特征图上采样为高分辨率的特征图,在图像生成、语义分割等任务中经常使用。例如在图像生成网络中,将随机噪声通过转置卷积逐步生成高分辨率的图像。
分组卷积nn.Conv2d(使用 groups 参数)将输入通道和输出通道分别分成若干组,每组独立进行卷积操作,最后将结果拼接起来。可以减少模型的参数数量,提高计算效率。在一些轻量级的神经网络中经常使用。

3. 卷积层的重要参数

在 PyTorch 的 torch.nn 模块中,卷积层是构建卷积神经网络(CNN)的核心组件之一。以下为你详细介绍卷积层的几个重要参数:


in_channels

  • 参数含义:该参数表示输入特征图的通道数。在处理图像数据时,通道数对应着图像的颜色通道,例如灰度图像的通道数为 1,RGB 彩色图像的通道数为 3。
  • 示例解释:假设你要处理 RGB 彩色图像,那么输入特征图的通道数 in_channels 就应该设置为 3。若使用预训练模型的中间层输出作为输入,这个输出的特征图通道数就决定了 in_channels 的取值。
  • 代码示例
import torch
import torch.nn as nn# 输入为 RGB 图像,通道数为 3
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, >kernel_size=3)

out_channels

  • 参数含义:此参数指定了卷积层输出特征图的通道数。它相当于卷积核的数量,每个卷积核会生成一个对应的输出通道。
  • 示例解释:若将 out_channels 设置为 16,意味着卷积层会使用 16 个不同的卷积核来对输入特征图进行卷积操作,最终会输出 16 个通道的特征图。在网络的不同层中,out_channels 的值通常会根据网络的设计和任务需求进行调整,例如在更深的层中可能会增加 out_channels 以提取更复杂的特征。
  • 代码示例
import torch
import torch.nn as nn# 输出特征图的通道数为 16
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)

kernel_size

  • 参数含义:该参数定义了卷积核的大小。卷积核是一个二维或三维的矩阵,用于在输入特征图上进行滑动并执行卷积操作。kernel_size 可以是一个整数,此时表示卷积核的高度和宽度相等;也可以是一个元组,分别指定卷积核的高度和宽度。
  • 示例解释:当 kernel_size = 3 时,意味着使用的是一个 3x3 的卷积核;若 kernel_size = (3, 5),则表示卷积核的高度为 3,宽度为 5。不同大小的卷积核可以捕捉不同尺度的特征,较小的卷积核(如 3x3)可以捕捉局部特征,而较大的卷积核(如 7x7)可以捕捉更全局的特征。
  • 代码示例
import torch
import torch.nn as nn# 使用 3x3 的卷积核
conv_layer_3x3 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
# 使用 3x5 的卷积核
conv_layer_3x5 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=(3, 5))

stride

  • 参数含义stride 表示卷积核在输入特征图上滑动的步长。它控制着卷积操作的抽样间隔,即卷积核每次移动的像素数。stride 可以是一个整数,也可以是一个元组,分别指定在高度和宽度方向上的步长。
  • 示例解释:若 stride = 1,卷积核每次在输入特征图上移动一个像素;若 stride = 2,则每次移动两个像素。较大的步长会减少输出特征图的尺寸,从而降低计算量,但可能会丢失一些细节信息。例如在图像分类任务中,适当增大步长可以加快模型的训练和推理速度。
  • 代码示例
import torch
import torch.nn as nn# 步长为 2
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=2)

padding

  • 参数含义padding 用于在输入特征图的边界周围填充值,通常填充 0。它可以控制输出特征图的尺寸,避免在卷积过程中由于边界信息丢失而导致特征图尺寸过度缩小。padding 可以是一个整数,表示在高度和宽度方向上填充的像素数相同;也可以是一个元组,分别指定在高度和宽度方向上的填充像素数。
  • 示例解释:当 padding = 1 时,会在输入特征图的上下左右各填充一行或一列 0;若 padding = (1, 2),则在高度方向上填充 1 个像素,在宽度方向上填充 2 个像素。通过合理设置 padding,可以使输出特征图的尺寸与输入特征图的尺寸保持一致或满足特定的要求。
  • 代码示例
import torch
import torch.nn as nn# 填充 1 个像素
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)

dilation

  • 参数含义dilation 表示卷积核的膨胀率。它控制着卷积核中元素之间的间距,默认值为 1。dilation 可以是一个整数,也可以是一个元组,分别指定在高度和宽度方向上的膨胀率。
  • 示例解释:当 dilation = 1 时,卷积核是正常的紧密排列;当 dilation = 2 时,卷积核中的元素之间会有一个像素的间距。膨胀卷积可以在不增加卷积核参数数量的情况下,增大卷积核的感受野,从而捕捉更广泛的特征信息。在语义分割任务中,膨胀卷积常用于扩大模型对上下文信息的感知能力。
  • 代码示例
import torch
import torch.nn as nn# 膨胀率为 2
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, dilation=2)

4. 卷积层总结

卷积层类名(torch.nn 中)用途参数解释
一维卷积nn.Conv1d主要用于处理一维序列数据,如音频信号、时间序列等。在音频处理中,可以将音频的波形信号作为输入,通过一维卷积提取不同时间步的特征。
  • in_channels:输入数据的通道数。例如音频单声道时为 1,立体声为 2。
  • out_channels:输出的通道数,即卷积核的数量。
  • kernel_size:卷积核的大小,是一个整数。
  • stride:卷积核在输入数据上滑动的步长,默认值为 1。
  • padding:在输入数据边界填充的数量,默认值为 0。
二维卷积nn.Conv2d广泛应用于处理二维图像数据,如图像分类、目标检测、语义分割等任务。通过二维卷积可以提取图像中的边缘、纹理等特征。
  • in_channels:输入图像的通道数,如 RGB 图像为 3。
  • out_channels:输出特征图的数量,即卷积核的数量。
  • kernel_size:卷积核的大小,可以是整数或元组,如 3(3, 3)
  • stride:卷积核在输入图像上滑动的步长。
  • padding:在图像边界填充的像素数。
三维卷积nn.Conv3d适用于处理三维数据,如视频数据(包含时间维度)、医学影像(如 CT 扫描数据)等。在视频分析中,可提取视频在时间和空间上的特征。
  • in_channels:输入数据的通道数。
  • out_channels:输出的通道数。
  • kernel_size:卷积核的大小,可以是整数或三维元组,如 3(3, 3, 3)
  • stride:卷积核在三个维度上的滑动步长。
  • padding:在三个维度边界填充的数量。
转置卷积(反卷积)nn.ConvTranspose2d常用于将低分辨率的特征图上采样为高分辨率的特征图,在图像生成、语义分割等任务中经常使用。例如在图像生成网络中,将随机噪声通过转置卷积逐步生成高分辨率的图像。
  • in_channels:输入特征图的通道数。
  • out_channels:输出特征图的通道数。
  • kernel_size:卷积核的大小。
  • stride:卷积核在输入特征图上的步长。
  • padding:输入特征图边界填充的数量。
  • output_padding:输出特征图额外增加的尺寸。
分组卷积nn.Conv2d(使用 groups 参数)将输入通道和输出通道分别分成若干组,每组独立进行卷积操作,最后将结果拼接起来。可以减少模型的参数数量,提高计算效率。在一些轻量级的神经网络中经常使用。
  • 除了常规的 in_channelsout_channelskernel_size 等参数外,groups 参数指定分组的数量,要求 in_channelsout_channels 都能被 groups 整除。

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

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

相关文章

Rust简洁控制流:if let与let else高效编程指南

文章目录Rust简洁控制流:if let与let else高效编程指南🎯 if let:专注单一匹配场景💡 if let核心优势:🔄 if let与else搭配使用🚀 let else:错误处理与提前返回💎 let el…

upload-labs靶场通关详解:第19关 条件竞争(二)

一、分析源代码//index.php // 初始化变量:标记上传状态和错误消息 $is_upload false; $msg null;// 检查是否通过POST方式提交了表单 if (isset($_POST[submit])) {// 引入自定义上传类require_once("./myupload.php");// 生成基于时间戳的文件名&…

一天两道力扣(3)

解法一:class Solution(object):def invertTree(self, root):if not root:return Noneroot.left, root.right root.right, root.leftself.invertTree(root.right)self.invertTree(root.left)return root解析:递归解法二:class Solution(obje…

jenkins2025安装、插件、邮箱发送使用

Tips:卸载从新安装(需要在C盘线先删除.jenkins文件),然后换个默认浏览器从新安装推荐的插件(不然安装插件这一步会报错,连接不到jenkins) 一、jenkins安装 访问jenkins官网:https://www.jenkins.io/download/ 双击war包开始下载…

vue中通过tabs 切换 时 显示不同的echarts 特殊处理

需要进行特殊处理 比如强制 进行resize 的方法 不然 大小显示会出现问题我先把全部的代码弄上<script setup lang"ts"> import { ref, onMounted, onBeforeUnmount, nextTick } from vue import { useRoute } from vue-router import { message } from ant-des…

浅度解读-(未完成版)浅层神经网络-深层神经网络

文章目录浅层神经网络的前向传播计算流程矩阵在运算时形状的变化激活函数的作用为什么要有激活函数反向传播深层神经网络参数超参数参数初始化初始化权重的值选择浅层神经网络的前向传播 计算流程 #mermaid-svg-tMPs4IUCtqxvhJ24 {font-family:"trebuchet ms",verda…

【vben3源码解读】【useEcharts】【VueUse】详解useEcharts这个hooks的作用与相关库的使用(VueUse)

源代码 import type { EChartsOption } from echarts;import type { Ref } from vue;import type { Nullable } from vben/types;import type EchartsUI from ./echarts-ui.vue;import { computed, nextTick, watch } from vue;import { usePreferences } from vben/preference…

报错 400 和405解决方案

今天出了好多这个错误&#xff0c;Uncaught (in promise) AxiosError {message: Request failed with status code 400 , name: AxiosError , code: ERR_BAD_REQUEST , config: {…}, request: XMLHttpRequest, …}反正就是前后端的参数不匹配&#xff0c;要不就是请求方式不…

Java源码的前端编译

Java源码的前端编译 欢迎来到我的博客&#xff1a;TWind的博客 我的CSDN:&#xff1a;Thanwind-CSDN博客 我的掘金&#xff1a;Thanwinde 的个人主页 0.前言 当一份Java代码写好时&#xff0c;将其进行编译&#xff0c;运行&#xff0c;并不是简单把这个Java源码从头到尾执行…

JWT6报错误 kid empty unable to lookup correct key

JWT5和jwt6在加密和解密和时候还明些区别的 &#xff0c;在5中&#xff0c;是不需要这个kid的&#xff0c;加解都不需要。但6中是需要这个keyId。 所以在使用的时候要做个区别&#xff0c;参考下面链接&#xff1a; ThinkPhp5.0.24 JWT报错 ‘“kid“ empty, unable to lookup…

高效学习之一篇搞定分布式管理系统Git !

一、Git是什么1&#xff0e;Git是目前世界上最先进的分布式版本管理系统 2&#xff0e;工作原理/流程workspace&#xff1a;工作区 Index/Stage&#xff1a;暂存区 Repository&#xff1a;仓库区&#xff08;本地仓库&#xff09; Remote&#xff1a;远程仓库二、SVN和Git的最主…

AdsPower API 新增查询环境 Cookies 接口,自动化更进一步!

你是不是有过这样的经历&#xff1f;账号在 AdsPower 环境中已经成功登录&#xff0c;但你还要花时间手动导出 Cookies、再整理处理&#xff0c;过程繁琐、效率低下。 现在&#xff0c;我们上线了 API 查询环境 Cookies 的接口&#xff0c;支持通过 API 直接获取已登录环境的 …

Craftium游戏引擎中的客户端同步机制解析

Craftium游戏引擎中的客户端同步机制解析 craftium A framework for creating rich, 3D, Minecraft-like single and multi-agent environments for AI research based on Minetest 项目地址: https://gitcode.com/gh_mirrors/cr/craftium 游戏状态同步的核心问题 在分…

spring cloud负载均衡之FeignBlockingLoadBalancerClient、BlockingLoadBalancerClient

本文主要分析被 FeignClient 注解的接口类请求过程中负载均衡逻辑&#xff0c;流程分析使用的源码版本信息如下&#xff1a;<spring-boot.version>3.2.1</spring-boot.version><spring-cloud.version>2023.0.0</spring-cloud.version>背景 平常我们代码…

提示工程(Prompt Engineering)研究进展

提示工程(Prompt Engineering)研究进展 以及它如何帮助大语言模型(LLMs)和视觉语言模型(VLMs)更好地工作。用简单的话说,就是通过设计巧妙的“提示”(比如指令、例子),让模型在不修改内部参数的情况下,更精准地完成各种任务,比如回答问题、推理、生成内容等。 文档…

【ARM】AI开发板A7处理器JTAG实现指南

一、文档背景尽管开发板原厂提供了相关文档&#xff0c;但可能缺乏对 A7 处理器 JTAG 功能的详细说明。这可能会导致以下问题&#xff1a;开发人员难以理解和利用 A7 处理器的基本功能&#xff0c;阻碍调试和开发进度。在进行Uboot移植过程中&#xff0c;无法应用图形界面的调试…

FPGA(一)Quartus II 13.1及modelsim与modelsim-altera安装教程及可能遇到的相关问题

零.前言 在学习FPGA课程时&#xff0c;感觉学校机房电脑用起来不是很方便&#xff0c;想着在自己电脑上下载一个Quartus II 来进行 基于 vhdl 语言的FPGA开发。原以为是一件很简单的事情&#xff0c;没想到搜了全网文章发现几乎没有一个完整且详细的流程教学安装&#xff08;也…

软考(软件设计师)存储管理—存储空间管理,文件共享保护

一、文件存取方法 1. 顺序存取&#xff08;Sequential Access&#xff09; 原理&#xff1a;按记录写入顺序依次访问特点&#xff1a; 读操作&#xff1a;读取当前位置&#xff0c;指针自动前移写操作&#xff1a;追加到文件末尾 适用场景&#xff1a;磁带设备、日志文件 #merm…

Thinkphp6中如何将macro方法集成到Request类中

在学习crmeb的时候发现他使用了一个macro的方法用在中间件中&#xff0c;于对macro进行了简单的研究&#xff0c;发现这个方法可以在中间件中进行定义一些方法&#xff0c;然后让后面的控制器进行使用。 如&#xff1a; 在授权的中间件中&#xff0c;定义了$request->macro…

Java List 使用详解:从入门到精通

一、List 基础概念1.1 什么是 List&#xff1f;List 就像是一个智能书架&#xff1a;可以按顺序存放书籍&#xff08;元素&#xff09;每本书都有固定位置&#xff08;索引&#xff09;可以随时添加、取出或重新排列书籍// 创建一个书架&#xff08;List&#xff09; List<S…