【深度学习】Pytorch教程(十三):PyTorch数据结构:5、张量的梯度计算:变量(Variable)、自动微分、计算图及其可视化

文章目录

  • 一、前言
  • 二、实验环境
  • 三、PyTorch数据结构
    • 1、Tensor(张量)
      • 1. 维度(Dimensions)
      • 2. 数据类型(Data Types)
      • 3. GPU加速(GPU Acceleration)
    • 2、张量的数学运算
      • 1. 向量运算
      • 2. 矩阵运算
      • 3. 向量范数、矩阵范数、与谱半径详解
      • 4. 一维卷积运算
      • 5. 二维卷积运算
      • 6. 高维张量
    • 3、张量的统计计算
    • 4、张量操作
      • 1. 张量变形
      • 2. 索引
      • 3. 切片
      • 4. 张量修改
    • 5、张量的梯度计算
      • 0. 变量(Variable)
      • 1. 自动微分
        • a. 单参数
        • b. 多参数
      • 2. 计算图
      • 3. 神经网络模型
      • 4. 可视化计算图结构

一、前言

  本文将介绍张量的梯度计算,包括变量(Variable)、自动微分、计算图及其可视化等

二、实验环境

  本系列实验使用如下环境

conda create -n DL python==3.11
conda activate DL
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
conda install pydot

三、PyTorch数据结构

1、Tensor(张量)

  Tensor(张量)是PyTorch中用于表示多维数据的主要数据结构,类似于多维数组,可以存储和操作数字数据。

1. 维度(Dimensions)

  Tensor(张量)的维度(Dimensions)是指张量的轴数或阶数。在PyTorch中,可以使用size()方法获取张量的维度信息,使用dim()方法获取张量的轴数。

在这里插入图片描述

2. 数据类型(Data Types)

  PyTorch中的张量可以具有不同的数据类型:

  • torch.float32或torch.float:32位浮点数张量。
  • torch.float64或torch.double:64位浮点数张量。
  • torch.float16或torch.half:16位浮点数张量。
  • torch.int8:8位整数张量。
  • torch.int16或torch.short:16位整数张量。
  • torch.int32或torch.int:32位整数张量。
  • torch.int64或torch.long:64位整数张量。
  • torch.bool:布尔张量,存储True或False。

【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量)及其维度(Dimensions)、数据类型(Data Types)

3. GPU加速(GPU Acceleration)

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

2、张量的数学运算

  PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。

1. 向量运算

【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)

2. 矩阵运算

【深度学习】Pytorch 系列教程(四):PyTorch数据结构:2、张量的数学运算(2):矩阵运算及其数学原理(基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量)

3. 向量范数、矩阵范数、与谱半径详解

【深度学习】Pytorch 系列教程(五):PyTorch数据结构:2、张量的数学运算(3):向量范数(0、1、2、p、无穷)、矩阵范数(弗罗贝尼乌斯、列和、行和、谱范数、核范数)与谱半径详解

4. 一维卷积运算

【深度学习】Pytorch 系列教程(六):PyTorch数据结构:2、张量的数学运算(4):一维卷积及其数学原理(步长stride、零填充pad;宽卷积、窄卷积、等宽卷积;卷积运算与互相关运算)

5. 二维卷积运算

【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理

6. 高维张量

3、张量的统计计算

【深度学习】Pytorch教程(九):PyTorch数据结构:3、张量的统计计算详解

4、张量操作

1. 张量变形

【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量变形操作

2. 索引

3. 切片

【深度学习】Pytorch 教程(十一):PyTorch数据结构:4、张量操作(2):索引和切片操作

4. 张量修改

【深度学习】Pytorch 教程(十二):PyTorch数据结构:4、张量操作(3):张量修改操作(拆分、拓展、修改)

5、张量的梯度计算

0. 变量(Variable)

  Variable(变量)是早期版本中的一种概念,用于自动求导(autograd)。从PyTorch 0.4.0版本开始,Variable已经被弃用,自动求导功能直接集成在张量(Tensor)中,因此不再需要显式地使用Variable。
  在早期版本的PyTorch中,Variable是一种包装张量的方式,它包含了张量的数据、梯度和其他与自动求导相关的信息。可以对Variable进行各种操作,就像操作张量一样,而且它会自动记录梯度信息。然后,通过调用.backward()方法,可以对Variable进行反向传播,计算梯度,并将梯度传播到相关的变量。

import torch
from torch.autograd import Variable# 创建一个Variable
x = Variable(torch.tensor([2.0]), requires_grad=True)# 定义一个计算图
y = x ** 2 + 3 * x + 1# 进行反向传播
y.backward()# 获取梯度
gradient = x.grad
print("梯度:", gradient)  # 输出: tensor([7.])

1. 自动微分

  PyTorch 使用自动微分机制来计算梯度,当定义一个 Tensor 对象时,可以通过设置 requires_grad=True 来告诉 PyTorch 跟踪相关的计算,并使用 backward() 方法来计算梯度:

a. 单参数
import torchx = torch.tensor([2.0], requires_grad=True)def f(x):return 5 * x ** 2 + 2 * x - 1# 计算函数的输出
y = f(x)# 使用backward()方法计算梯度
y.backward()# 获取梯度值
gradient = x.grad
print(gradient)

输出:

tensor([22.])

y ′ = 10 x + 2 22 = 10 ∗ 2 + 2 y'=10x+2\\22=10*2+2 y=10x+222=102+2

b. 多参数
import torchdef f(x, w, b):return 1 / (torch.exp(-(w * x + b)) + 1)# 设置输入参数
x = torch.tensor(1.0, requires_grad=True)
w = torch.tensor(0.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)# 计算函数f(x;w,b)的值
result = f(x, w, b)# 使用自动微分计算梯度
result.backward()
print(x.grad)  # 求关于x的梯度
print(w.grad)  # 求关于w的梯度
print(b.grad)  # 求关于b的梯度

在这里插入图片描述

2. 计算图

  计算图是一种用来表示数学运算过程的图形化结构,它将数学计算表达为节点和边的关系,提供了一种直观的方式来理解和推导复杂的数学运算过程。在深度学习中,计算图帮助我们理解模型的训练过程,直观地把握损失函数对模型参数的影响,同时为反向传播算法提供了理论基础。现代深度学习框架如 PyTorch 和 TensorFlow 都是基于计算图的理论基础构建出来的。
f ( x ; w , b ) = 1 e − ( w x + b ) + 1 f(x;w,b)=\frac{1}{e^{-(wx+b)}+1} f(x;w,b)=e(wx+b)+11 x = 1 , w = 0 , b = 0 x=1,w=0,b=0 x=1,w=0,b=0
在这里插入图片描述
在这里插入图片描述
  计算图包括两种节点:计算节点(Compute Node)和数据节点(Data Node)。

  • 数据节点:表示输入数据、参数或中间变量,在计算图中通常用圆形结点表示。数据节点始终是叶节点,它们没有任何输入,仅表示数据。

  • 计算节点:表示数学运算过程,它将输入的数据节点进行数学运算后输出结果。在计算图中通常用方形结点表示。计算节点可以有多个输入和一个输出。反向传播算法中的梯度计算正是通过计算节点来实现的。

一个完整的计算图可以分为正向传播和反向传播两个阶段:

  • 正向传播(Forward Propagation):输入数据经过计算节点逐层传播,最终得到输出结果

  • 反向传播(Backward Propagation):首先根据损失函数计算输出结果与真实标签之间的误差,然后利用链式法则,逐个计算每个计算节点对应的输入的梯度,最终得到参数的梯度信息

3. 神经网络模型

略~详见后文模块(Module) 部分

import torchclass MyModel(torch.nn.Module):def __init__(self):super(MyModel, self).__init__()def forward(self, x, w, b):return 1 / (torch.exp(-(w * x + b)) + 1)model = MyModel()# 设置输入参数
x = torch.tensor(1.0, requires_grad=True)
w = torch.tensor(0.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)# Forward pass
output = model(x, w, b)# Backward pass
output.backward()# Access the gradients
print(x.grad)  # Gradient with respect to x
print(w.grad)  # Gradient with respect to w
print(b.grad)  # Gradient with respect to b

4. 可视化计算图结构

  以下内容完全由GPT生成:

import torch
import onnx
from onnx.tools.net_drawer import GetPydotGraph
import pydotclass MyModel(torch.nn.Module):def __init__(self):super(MyModel, self).__init__()def forward(self, x, w, b):return 1 / (torch.exp(-(w * x + b)) + 1)model = MyModel()x = torch.tensor(1.0, requires_grad=True)
w = torch.tensor(0.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)# 导出为ONNX格式
torch.onnx.export(model, (x, w, b), "f.onnx", verbose=True, input_names=["x", "w", "b"], output_names=["output"])# 可视化计算图结构
model = onnx.load("f.onnx")
pydot_graph = GetPydotGraph(model.graph, name=model.graph.name, rankdir="TB"# rankdir="LR")  # Set rankdir to "LR" for left to right orientation
pydot_graph.write_dot("f_computation_graph.dot")# 将dot文件转换为PNG格式的图像
(graph,) = pydot.graph_from_dot_file('f_computation_graph.dot')
graph.write_png('f_computation_graph.png')

在这里插入图片描述

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

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

相关文章

七大查找算法详解并附代码实现

基本查找 也叫做顺序查找 说明:顺序查找适合于存储结构为数组或者链表。 基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线的一端开始,顺序扫描,依次将遍历到的结点与要查找的值相比较,…

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初,信息化战争使战场环境变得更为复杂和难以预测,持续涌入的海量、多样化、多来源和高维度数据,加大了指挥员的认知负担,使其需要具备更强的数据处理能力。 同时,计算机技术和人工智能技术的飞速发展&#xff…

计算机操作系统(慕课版)第一章学习笔记

第一章学习笔记 1.1 操作系统的概念 操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充,其主要作用是管理硬件设备,提高他们的利用率和系统吞吐量,并为用户和应用程序提供一个简单的接口,以便用户和应…

SocketError | Socket错误码一览表(每一种错误码的故障排查建议)

Socket错误码一览表 文章目录 Socket错误码一览表前言错误码表 前言 在软件开发和网络通信编程中,SocketError算是一个绕不开的坎。它可能因为各种原因而来,比如网络问题、用户搞错了、应用程序出错等等。本文整理一张SocketError排查建议表格就是为了帮…

Superhuman 邮箱的替代方案是什么?

Superhuman是一个极好的人工智能工具在电子邮件助理领域。根据SimilarWeb的最新统计,它在全球网站排名中排名第21980位,月访问量为1751798。然而市场上还有许多其他优秀的选择。为了帮助您找到最适合您需求的解决方案,我们为您精心挑选了10种…

计算机操作系统(慕课版)第三章学习笔记

第三章 处理机调度与死锁 1.1 调度的层次 高级调度、低级调度和中级调度。 中级调度:在内存和外存对换区之间按照给定的原则和策略选择进程对换。 目的: 提高主存利用率,调节系统负荷进行程序的调试、检查和改正;当系统出现故障或…

vue + koa + 阿里云部署 + 宝塔:宝塔前后端部署

接上篇,我们已经完成了宝塔的基本配置,下面我们来看如何在宝塔中部署前后端 一、上传前后端代码文件 在www > wwwroot目录下创建了一个demo文件,用来存放前后端代码 进入demo中,点击上传 这里前端我用的打完包的 dist文件&am…

08_第八章 微头条项目开发(PostMan测试工具)

文章目录 第八章 微头条项目开发一 项目简介1.1 微头条业务简介1.2 技术栈介绍1.3 功能展示 二 前端项目环境搭建三 后端项目环境搭建3.1 数据库准备3.2 MVC项目架构模式3.3 搭建项目3.3.1 创建WEB项目3.3.2 导入依赖3.3.3 准备包结构 3.5 准备工具类3.5.1 异步响应规范格式类3…

Jquery中的事件与动画

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章目标 使用常用简单事件制作网页特效使用鼠标事件制作主导航特效使用hover()方法制作下拉菜单特效使用鼠标事件及动画制作页面特效 一.Jquery事件概述 二.基础事件 鼠标事件 演示案例&…

.NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】

设计模式是软件工程中常用的解决特定问题的通用设计方法。它们提供了经过验证的解决方案,可用于解决在软件开发过程中经常遇到的一些常见问题。设计模式不是一种具体的编程语言特性或语法,而是一种通用的设计思想或模板,可以帮助开发人员设计…

如何在项目中考虑非功能需求

软件的非功能需求指的是除了软件的功能需求以外,软件需要满足的一些其他需求。常见的非功能需求包括: 性能需求:软件需要在特定的时间内完成特定的任务,例如响应时间、吞吐量等。可靠性需求:软件需要在各种环境下都能…

pclpy VoxelGrid 滤波器 (降体素化)

[TOC](pclpy VoxelGrid 滤波器 (降体素化)) 一、算法原理 使用体素化网格方法对点云数据集进行下采样(即减少点数)。VoxelGrid类。在输入点云数据上创建一个3D 体素网格(将体素网格视为空间中的一组微小的 3D 框)。然后在每个体…

RK3568平台开发系列讲解(基础篇)如何快速学习一套 Linux开发板源码

🚀返回专栏总目录 文章目录 一、基础代码二、驱动代码沉淀、分享、成长,让自己和他人都能有所收获!😄 拿到一份源码和一块评估板,如何快速找到与这块板相关的源码,是很多研发人员都曾遇到过的问题。如果对内核源码结构有大概了解,要完成这些事情也不难,通常可按照基础…

AVL树简介及其四种旋转

AVL树由二叉搜索树进化而来。在二叉搜索树中如果出现特殊情况:所有插入的数据均为有序,根据二叉搜索树的插入原理,其会退化为单枝斜向下的而二叉树,此时插入,查找,删除的效率也就退化成了O(n),效…

CUDA编程 - 用向量化访存优化 elementwise 核函数 - 学习记录

Cuda elementwise 一、简介1.1、ElementWise1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.2、Cuda elementwise - Add2.3、Cuda elementwise - Sigmoid2.3.1、简单的 Sigmoid 函数2.3.2、ElementWise Sigmoid float4(向量化访存) 2.4、C…

js里面有引用传递吗?

一:什么是引用传递 引用传递是相对于值传递的。那什么是值传递呢?值传递就是在传递过程中再复制一份,然后再赋值给变量,例如: let a 2; let b a;在这个代码中,let b a; 就是一个值传递,首先…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程!我们将从一个非常基础但重要的示例开始:创建一个简单的Spring Boot应用程序,并输出“Hello World”。 1. 环境准备 首先,确保你的开发环境已经安装了以下工具: Java Development …

读人工不智能:计算机如何误解世界笔记04_数据新闻学

1. 计算化和数据化的变革 1.1. 每一个领域都在进行计算化和数据化的变革 1.1.1. 出现了计算社会科学、计算生物学、计算化学或其他数字人文学科 1.1.2. 生活已走向计算化,人们却一点也没有变 1.2. 在如今的计算化和数据化世界中,调查性新闻的实践必须…

掌握ChatGPT润色绝技:什么是人工智能写作以及如何使用它来完成写作任务

如对AI写论文感兴趣,欢迎添加作者wx讨论 : ryan_2982 人工智能 (AI) 的出现开创了技术进步的新时代,彻底改变了包括写作和内容创作在内的各个行业。人工智能写作和人工智能提示已成为可以简化和增强写作任务的强大工具。在这篇博文中,我们将…

2018-02-14 新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】

2018-02-14新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】资源-CSDN文库https://download.csdn.net/download/liuzhuchen/88878591爬虫过的站点: 1QQ新闻 1,准备爬取滚动新闻页面 2 通过F12 开发工具查找发现&#xff…