【深度学习实验】前馈神经网络(六):自动求导

news2025/1/12 23:42:12

目录

一、实验介绍

 二、实验环境

1. 配置虚拟环境

2. 库版本介绍

三、实验内容

0. 导入必要的工具包

1. 标量求导

2. 矩阵求导

3. 计算图


一、实验介绍

       PyTorch提供了自动求导机制,它是PyTorch的核心功能之一,用于计算梯度并进行反向传播。自动求导机制使得深度学习中的梯度计算变得更加简单和高效。

 二、实验环境

    本系列实验使用了PyTorch深度学习框架,相关操作如下:

1. 配置虚拟环境

conda create -n DL python=3.7 
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib
 conda install scikit-learn

2. 库版本介绍

软件包本实验版本目前最新版
matplotlib3.5.33.8.0
numpy1.21.61.26.0
python3.7.16
scikit-learn0.22.11.3.0
torch1.8.1+cu1022.0.1
torchaudio0.8.12.0.2
torchvision0.9.1+cu1020.15.2

三、实验内容

ChatGPT:

        前馈神经网络(Feedforward Neural Network)是一种常见的人工神经网络模型,也被称为多层感知器(Multilayer Perceptron,MLP)。它是一种基于前向传播的模型,主要用于解决分类和回归问题。

        前馈神经网络由多个层组成,包括输入层、隐藏层和输出层。它的名称"前馈"源于信号在网络中只能向前流动,即从输入层经过隐藏层最终到达输出层,没有反馈连接。

以下是前馈神经网络的一般工作原理:

  1. 输入层:接收原始数据或特征向量作为网络的输入,每个输入被表示为网络的一个神经元。每个神经元将输入加权并通过激活函数进行转换,产生一个输出信号。

  2. 隐藏层:前馈神经网络可以包含一个或多个隐藏层,每个隐藏层由多个神经元组成。隐藏层的神经元接收来自上一层的输入,并将加权和经过激活函数转换后的信号传递给下一层。

  3. 输出层:最后一个隐藏层的输出被传递到输出层,输出层通常由一个或多个神经元组成。输出层的神经元根据要解决的问题类型(分类或回归)使用适当的激活函数(如Sigmoid、Softmax等)将最终结果输出。

  4. 前向传播:信号从输入层通过隐藏层传递到输出层的过程称为前向传播。在前向传播过程中,每个神经元将前一层的输出乘以相应的权重,并将结果传递给下一层。这样的计算通过网络中的每一层逐层进行,直到产生最终的输出。

  5. 损失函数和训练:前馈神经网络的训练过程通常涉及定义一个损失函数,用于衡量模型预测输出与真实标签之间的差异。常见的损失函数包括均方误差(Mean Squared Error)和交叉熵(Cross-Entropy)。通过使用反向传播算法(Backpropagation)和优化算法(如梯度下降),网络根据损失函数的梯度进行参数调整,以最小化损失函数的值。

        前馈神经网络的优点包括能够处理复杂的非线性关系,适用于各种问题类型,并且能够通过训练来自动学习特征表示。然而,它也存在一些挑战,如容易过拟合、对大规模数据和高维数据的处理较困难等。为了应对这些挑战,一些改进的网络结构和训练技术被提出,如卷积神经网络(Convolutional Neural Networks)和循环神经网络(Recurrent Neural Networks)等。

本系列为实验内容,对理论知识不进行详细阐释

(咳咳,其实是没时间整理,待有缘之时,回来填坑)

977468b5ae9843c6a88005e792817cb1.png

0. 导入必要的工具包

import torch

1. 标量求导

        对只有一个输出值的函数进行求导,结果是一个标量值。

# 最简单的情况,X是一个标量
x = torch.tensor(2, dtype=torch.float32, requires_grad=True)
y = x ** 2 + 4 * x
print(x.grad)
y.backward()
print(x.grad)
  • 创建一个名为x的张量,其值为2,数据类型为float32,并设置requires_gradTrue以启用自动求导功能。

  • y = x ** 2 + 4 * x:定义一个新的张量y,其值为x的平方加上4乘以x

  • 在调用backward()函数之前,打印x的梯度值。由于还没有进行反向传播,x.grad的值为None

  • 通过调用backward()函数,计算y相对于所有需要梯度的张量的梯度。在这种情况下,只有x需要梯度,因此x.grad将被计算。

  • 在调用backward()函数之后,打印x的梯度值,即导数。由于y是关于x的函数,并且我们通过backward()函数进行了反向传播,所以x.grad现在将包含y相对于x的导数值。

输出:

None
tensor(8.)

2. 矩阵求导

        对具有多个输出值的函数进行求导,结果是一个矩阵或向量。

x = torch.ones(2, 2, requires_grad=True)
print(x.grad)
# y是一个矩阵
y = x ** 2 + 4 * x
y.backward(torch.ones(2, 2))
print(x.grad)
  • 创建一个2x2的张量x,其所有元素的值都为1,并设置requires_gradTrue以启用自动求导功能。

  • 在调用backward()函数之前,打印x的梯度值。由于还没有进行反向传播,x.grad的值为None

  • 定义一个新的张量y,其值为x的每个元素的平方加上4乘以x的每个元素。由于x的形状为2x2,因此y也将具有相同的形状。

  • y.backward(torch.ones(2, 2)):通过调用backward()函数,计算y相对于所有需要梯度的张量的梯度。在这种情况下,只有x需要梯度,torch.ones(2, 2)表示将梯度初始化为2x2的全1矩阵。

  • print(x.grad):打印x的梯度值,即导数。由于y是关于x的函数,并且我们通过backward()函数进行了反向传播,所以x.grad将包含y相对于x的导数值

输出:

None
tensor([[6., 6.],
        [6., 6.]])

x = torch.ones(2, 2, requires_grad=True)
# y是一个矩阵
y = x ** 2 + 4 * x
y.backward(torch.ones(2, 2))
print(x.grad)

u = x ** 3 + 2 * x
# z是一个标量
z = u.sum()
z.backward()
print(x.grad)
  • u = x ** 3 + 2 * x:定义一个新的张量u,其值为x的每个元素的立方加上2乘以x的每个元素。由于x的形状为2x2,因此u也将具有相同的形状。

  • z = u.sum():定义一个新的标量z,其值为u所有元素的总和。sum()函数将u中的所有元素相加得到一个标量值。

  • z.backward():通过调用backward()函数,计算z相对于所有需要梯度的张量的梯度。在这种情况下,只有x需要梯度,因为u是关于x的函数。

  • print(x.grad):打印x的梯度值,即导数。由于z是关于x的函数,并且我们通过backward()函数进行了反向传播,所以x.grad将包含z相对于x的导数值。

输出:

tensor([[6., 6.],
        [6., 6.]])
tensor([[11., 11.],
        [11., 11.]])

3. 计算图

        计算图是一种数据结构,用于表示数学运算的依赖关系。在深度学习中,计算图被广泛用于自动求导和反向传播算法。

        计算图由节点和边组成。节点表示操作或变量,边表示操作之间的依赖关系。在计算图中,变量通常被称为叶子节点或输入节点,操作则被称为内部节点或计算节点。

        计算图的构建过程包括以下步骤:

  1. 定义输入节点(叶子节点):将输入数据转换为张量,并设置其requires_grad属性为True,以便追踪梯度。
  2. 定义计算节点:使用张量之间的数学运算(如加法、乘法、平方等)构建计算节点。
  3. 构建计算图:将输入节点和计算节点连接起来,形成一个有向无环图,表示了操作之间的依赖关系。
  4. 前向传播:通过计算图从输入节点到输出节点的路径,按照依赖关系依次执行数学运算,计算出输出节点的值。
  5. 反向传播:从输出节点开始,沿着计算图的反向路径计算每个节点的梯度。根据链式法则,每个节点的梯度可以通过后续节点的梯度和该节点的局部梯度计算得到。
  6. 梯度更新:使用计算得到的梯度值更新模型的参数,以进行优化和训练。
import torch

x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)
z = x**2 + y**3
z.backward()
print("Gradient of x:", x.grad)
print("Gradient of y:", y.grad)

输出:

Gradient of x: tensor(4.)
Gradient of y: tensor(27.)

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

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

相关文章

C++流插入和流提取的重载!

C作为C语言的衍生,其弥补了C语言中的很多不足,也对C语言进行了一定的优化!今日就来讲解一下C中输入/出流相关的知识!以及对输入/出的重载!,希望读完本篇文章,能让读者们对C中输入/出流有更深一步…

Java之IO概述以及

1.1 什么是IO 生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrls ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键…

散列(哈希)查找的定义,常见的散列函数设计以及处理哈希冲突方法

1.散列表 1.散列表的定义 散列表(Hash Table),又称哈希表。 是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关。 特点: 若不同的关键字通过散列函数映射到同一个值,则称它们为“同义词”。通过散列函数确定的位置…

Maven 设置环境变量(Windows、Linux)

文章目录 Windows 配置 Maven 环境变量Linux 配置 Maven 环境变量 如果想在任意路径下都能通过 mvn 命令运行 Maven 程序,就需要将 Maven 程序路径设置到环境变量中, 否则使用 mvn 命令时每次都要加上 Maven 程序的全路径 核心就一句话,把 M…

坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期

中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力,是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市,2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

学习记忆——英语篇——右脑记忆单词

文章目录 英语字母形象起源右脑记忆单词的原则四大步骤第一步:摄取信息第二步:处理信息第三步:储存信息第四步:提取信息 训练例子字母形象训练 右脑记忆单词5大方法字源法编码法字母编码法字母组合编码法 拼音法全拼法拼音组合 熟…

springcloud3 分布式事务解决方案seata之XA模式4

一 seata的模式 1.1 seata的几种模式比较 Seata基于上述架构提供了四种不同的分布式事务解决方案: XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入 TCC模式:最终一致的分阶段事务模式,有…

操作系统:中断和异常

1.中断的作用 CPU上会运行两种程序,一种是操作系统内核程序(是整个系统的管理者),一种是应用程序。 1.中断的特点 在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序。“中断”是让操作系统内核夺回CPu使…

java智慧园区系统源码 智慧园区小程序源码

java智慧园区系统源码 智慧园区小程序源码 技术框架: 核心框架:Spring Boot 2.4.0 安全框架:JwtPermission 3.1.1 前端:Ant Design Vue 1.6.2 持久层框架:MyBatis-Plus 3.4.1 关系型数据库: Mysql 8.0.22 数据库…

【开发篇】一、热部署

文章目录 1、手工启动热部署2、自动启动热部署3、热部署范围配置4、关闭热部署功能 1、手工启动热部署 日常开发与调试&#xff0c;改几行代码想看效果就得手动点重启&#xff0c;很繁琐&#xff0c;接下来考虑启动热部署。首先引入springboot开发者工具&#xff1a; <dep…

找视频背景音乐素材,就上这6个网站。

找背景音乐、BGM、音效素材&#xff0c;就上这6个网站&#xff0c;国内外都有&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来~ 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYwNDUx 菜鸟图库是一个综合性素材网站&#xff0c;站内涵盖设计、图…

ceph分布式存储部署

一、概述 是一个统一的分布式存储系统&#xff0c;设计初衷是提供较好的性能、可靠性和可扩展性。 特点 1、统一存储 虽然 ceph 底层是一个分布式文件系统&#xff0c;但由于在上层开发了支持对象和块的接口。所以在开源存储软件中&#xff0c;能够一统江湖。至于能不能千秋万…

单片机学习--->Keil多文件工程

1、在文件夹中创建新的文件夹 目录&#xff1a; App 文件夹&#xff1a;用于存放外设驱动文件&#xff0c;如 LED、数码管、定时器等。 Obj 文件夹&#xff1a;用于存放编译产生的 c/汇编/链接的列表清单、调试信息、 hex 文件、预览信息、封装库等文件。 Public 文件夹&#x…

D. Edge Split

Problem - D - Codeforces 思路&#xff1a;思路想到了&#xff0c;但是不知道用什么方法写。。首先我们先看只有一个树的情况&#xff0c;那么如果我们所有的边是一个颜色&#xff0c;那么答案是1n&#xff0c;如果我们将其中的一条边变色&#xff0c;那么产生的答案是2n-1&am…

buuctf web [ACTF2020 新生赛]Upload

明了但不明显的文件上传 传个试试 行&#xff0c;抓包吧&#xff0c;php格式不行&#xff0c;就先上传要求的格式&#xff1a;jpg、png、gif 抓到上传的包之后&#xff0c;再修改成我们想要的 常见的php格式绕过有&#xff1a;php,php3,php4,php5,phtml,pht 挨个试试 这是上个…

Python 根据身高体重计算体质(BMI)指数

""" 根据身高体重计算体质(BMI)指数知识点&#xff1a;1、计算公式&#xff1a;体质指数(BMI) 体重(KG) / (身高(M) * 身高(M))2、变量类型转换3、运算符幂**&#xff0c;例如&#xff1a;3 ** 2 9 <> 3 * 34、更多的运用请参考&#xff1a;https://blo…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow环境PyQt5环境 模块实现1. 数据预处理 相关其它博客工程源代码下载其它资料下载 前言 本项目采用了矩阵分解算法&#xff0c;用于对玩家已游玩的数据进行深入分析。它的目标是从众多游戏中筛选出最适合…

糖果传递问题(超详细的数论公式推导+贪心结论+均分问题)

糖果传递问题 文章目录 糖果传递问题问题描述问题分析【公式推导过程】代码 问题描述 有 n 个小朋友坐成一圈&#xff0c;每人有 a[i] 个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正…

【2】贪心算法-综述

前言 从前&#xff0c;有一个很穷的人救了一条蛇的命&#xff0c;蛇为了报答他的救命之 恩&#xff0c;于是就让这个人提出要求&#xff0c;满足他的愿望。这个人一开始只要求简 单的衣食&#xff0c;蛇都满足了他的愿望&#xff0c;后来慢慢地贪欲升起&#xff0c;要求做官&am…

基于SSM的出租车管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…