Pytorch框架——自动微分和反向传播

一、自动微分概念

自动微分(Automatic Differentiation,AD)是一种利用计算机程序自动计算函数导数的技术,它是机器学习和优化算法中的核心工具(如神经网络的梯度下降),通过反向传播计算并更新梯度。

计算梯度的目的是更新权重w和b,\theta _{1}=\theta _{0}-lr*value,其中value是梯度值,学习率需要提前指定,求导计算梯度,前面我们学过了手动求导,这次使用自动微分的方法,来简化我们的工作量。

注意:

1. w和b一定是可自动微分的张量,类型是浮点型,超参数requries_grad=Ture表示允许自动微分。

2. detach():自动微分的张量不能转换成numpy数组, 通过 张量.detach().numpy() 剥离成不自动微分后可以转换。detach()返回一个与当前张量共享数据的新张量,该张量是不开启自动微分的,不参与梯度计算。

    clone():返回一个与当前张量数据相同的新张量,默认开启自动微分,但新张量拥有独立的存储。

3. 默认梯度是累加的,所以多轮中每个轮次需要在自动微分之前进行清零!!!

4. 查看张量底层数据地址时推荐使用 张量名.data_ptr() 

import torch# TODO 单轮
#定义权重,并开启自动微分
w = torch.tensor([10,20],requires_grad=Ture,dtype=torch.float)
#定义损失函数(loss,cost,criterion...)
loss = 2 * w**2
#自动微分求梯度,自动更新梯度
loss.sun().backward()
#手动更新权重
w.data = w.data - 0.01*w.grad# TODO 多轮
#定义权重,并开启自动微分
w = torch.tensor([10,20],requires_grad=Ture,dtype=torch.float)
#定义遍历轮次
epochs = 500
for epoch in range(epochs):loss = 2 * w**2# 默认梯度是累加的,所以每轮需要在自动微分之前进行清零if w.grad is not None:w.grad.zero_()loss.sum().backward()# 格式化输出print(f"当前轮次:{epoch + 1} 当前权重: {w.data},固定学习率:{0.01} 更新后梯度: {w.grad},下一个权重: {w.data - 0.01 * w.grad}")#手动更新权重w.data = w.data - 0.01*w.grad

推导w和b的方法:

import torch
x = torch.ones(2, 5)
y = torch.zeros(2, 3)
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)# 1.首先获取损失函数
loss_fn = torch.nn.MSELoss()
# 2.然后,计算预测值-> z=wx+b 注意: 这里面的wx是矩阵乘法,需要遵循 (n,m)*(m,p)=(n,p)
z = x.matmul(w) + b
# 3.接着,根据损失函数计算损失值
loss = loss_fn(z, y)
# 4.最后,反向传播推导更新梯度
loss.sum().backward()# 5.打印结果
print(f'w.grad: {w.grad}')
print(f'b.grad: {b.grad}')

二、 反向传播及案例

正向传播:从输入到输出,目的是预测结果和损失值;

反向传播:从输出到输入,更新参数做出优化。

案例:使用pytorch构建一个回归模型

步骤:

1.获取数据集,提前封装数据为张量

2.模型训练预测以及计算损失值

3.绘制损失曲线以及预测和真实值的拟合线

from sklearn.datasets import make_regression
import torch
from torch.utils.data import DataLoader, TensorDataset
from torch.nn import Linear, MSELoss
from torch.optim import SGD
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1.获取数据集,提前封装成张量
def get_data():X,y,coef = make_regressionn(n_samples=100,n_features=1,n_targets=1,noise=10,random_state=1,coef=Ture,bias=14.5)X = torch.tensor(X,dtype=torch.float32)y = torch.tensor(y,dtype=torch.float32)return X,y,coef# 2.模型训练预测及损失值计算
def get_model_and_loss_list(x, y, epochs):# 2.1 处理数据封装为数据加载器,为了分批次训练,避免内存溢出dataloader = DataLoader(TensorDataset(x,y),batch_size = 5,shuffle=Ture)# 2.2 创建模型对象,为了模型预测model = Linear(in_features=1,out_features=1)# 2.3 创建损失函数对象,为了计算损失值loss_fn = MSELoss()# 2.4 创建SGD优化器对象,为了更新模型参数optimizer = SGD(model.parameters(),lr=0.03)# 2.5 模型训练预测和计算损失# 2.5.1 定义一个空列表,用于保存每轮损失值,再定义累加损失和批次,用于计算每轮的损失值loss_list,total_loss,batch_cnt = [],0.0,0# for循环,外循环轮次,内循环批次for epoch in range(epochs):for batch_x,batch_y in dataloader:# [重点] 正向传播# 计算预测值y_predict = model(batch_x)# 计算损失值,MSE计算要求形状必须一致,否则自动广播会出现无效计算loss = loss_fn(y_predict,batch_y.reshape(-1,1))# 累加损失和批次total_loss += loss.item()batch_cnt += 1# [重点] 反向传播# 梯度清零optimizer.zero_grad()# 梯度计算loss.backward()# 参数更新 step()底层是w1 = w0-lr*梯度optimizer.step()# TODO 内层循环结束,即一轮结束,可以计算每轮损失值,并保存到列表中epoch_loss = total_loss / batch_cntloss_list.append(epoch_loss)print(f"第{epoch + 1}轮,损失值为:{epoch_loss:.2f}")# TODO 外层循环结束,即所有轮次结束,可以返回模型和损失值列表# 打印模型参数字典print(f"模型参数:{model.state_dict()}")# print(f"模型权重:{model.weight}, 偏置:{model.bias}")# 返回结果return model, loss_list# 3.绘制损失曲线及预测和真实值拟合线
def plot_show(epochs, model, loss_list, x, y, coef):# todo 1.绘制每轮损失曲线plt.plot(range(epochs), loss_list)plt.xlabel('训练的轮数')plt.ylabel('该轮的平均损失')plt.title('损失变化曲线图')plt.grid()plt.show()#  todo 2.绘制预测和真实值拟合线plt.scatter(x, y)# 使用x的最小值,最大值生成1000个x值等差张量X = torch.linspace(x.min(), x.max(), 1000)# 细节:  numpy * 张量 -> 不可以     张量 * numpy -> 可以, 要么把v放到前面位置要么把coef转为张量y_pred = torch.tensor([v * model.weight + model.bias for v in X])y_true = torch.tensor([v * coef + 14.5 for v in X])plt.plot(X, y_pred, label='训练', color='red')plt.plot(X, y_true, label='真实', color='green')plt.legend()plt.grid()plt.show()if __name__ =='__main__':# 1.获取数据集,提前封装数据为张量x, y, coef = get_data()# 2.模型训练预测以及计算损失值epochs = 4000model, loss_list = get_model_and_loss_list(x, y, epochs)# 3.绘制损失曲线以及预测和真实值拟合线plot_show(epochs, model, loss_list, x, y, coef)

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

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

相关文章

【Linux手册】进程的状态:从创建到消亡的“生命百态”

目录 前言 操作系统进程状态 运行状态 阻塞状态 挂起状态 Linux中具体的进程状态 R(running)运行状态 S(sleeping)阻塞状态 D(disk sleep)磁盘休眠状态 T(stopped)和t(tracing stop) X(dead)终止状态 Z(zombie)僵尸状态 僵尸进程的危害 前言 我们在运行可执行程序…

李沐--动手学深度学习 LSTM

1.从零开始实现LSTM #从零开始实现长短期记忆网络 import torch from torch import nn from d2l import torch as d2l#加载时光机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定义和初始化模型参数&#xff…

面经的疑难杂症

1.介绍一下虚拟地址,虚拟地址是怎么映射到物理地址的? 虚拟地址是指在采用虚拟存储管理的操作系统中,进程访问内存时所使用的地址。每个进程都有独立的虚拟地址空间,虚拟地址通过操作系统和硬件(如MMU,内存…

去噪扩散概率模型(DDPM)全解:从数学基础到实现细节

一、 概述 在这篇博客文章中,我们将深入探讨去噪扩散概率模型(也被称为 DDPMs,扩散模型,基于得分的生成模型,或简称为自动编码器),这可以说是AIGC最近几年飞速发展的基石,如果你想做…

【系统分析师】2011年真题:案例分析-答案及详解

文章目录 试题1【问题 1】【问题 2】【问题 3】 试题2【问题 1】【问题 2】【问题 3】 试题3【问题 1】【问题 2】【问题 3】 试题4【问题 1】【问题 2】【问题 3】 试题5【问题 1】【问题 2】【问题 3】 试题1 随着宽带应用快速发展,用户要求系统服务提供商提供基…

【unitrix】 1.7 规范化常量类型结构(standardization.rs)

一、源码 这段代码实现了一个二进制数字标准化系统,用于将二进制数字类型(B0/B1)转换为更简洁的表示形式。 //! 二进制数字标准化模块 / Binary Number Normalization Module //! //! 提供将二进制数字(B0/B1)标准化为更简洁表示形式的功能…

NJet Portal 应用门户管理介绍

nginx向云原生演进,All in OpenNJet! 1. 应用门户简介 NJet 应用引擎是基于 Nginx 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,NJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加…

uni-app学习笔记三十六--分段式选项卡组件的使用

先来看效果: 上图有3个选项卡(PS:uniapp官方称之为分段器,我还是习惯叫选项卡),需要实现点击不同的选项卡时下方切换显示对应的数据。 下面介绍下实现的过程。 1.在uniapp官方文档下载并安装该扩展组件:u…

Qt:Qt桌面程序正常退出注意事项

一般情况下,Qt窗体的创建和显示命令如下: Main_window main_window; main_window.show(); 主窗体中设置属性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 则在main.cpp中可以将窗体创建为指针,这样在退出时可以正确释放指针…

【arXiv2024】时间序列|TimesFM-ICF:即插即用!时间序列预测新王者!吊打微调!

论文地址:https://arxiv.org/pdf/2410.24087 代码地址:https://github.com/uctb/TSFM 为了更好地理解时间序列模型的理论与实现,推荐参考UP “ThePPP时间序列” 的教学视频。该系列内容系统介绍了时间序列相关知识,并提供配套的论…

从0开始学习语言模型--Day02-如何最大化利用硬件

如何利用硬件 这个单元分为内核、并行处理和推理。 内核(Kernels) 我们说的内核一般指的就是GPU,这是我们用于计算的地方,一般说的计算资源就指的是GPU的大小。我们模型所用的数据和参数一般存储在内存里,假设把内存…

ElasticSearch配置详解:设置内存锁定的好处

什么是内存锁定 "bootstrap": {"memory_lock": "true" }内存锁定是指将Elasticsearch的JVM堆内存锁定在物理内存中,防止操作系统将其交换(swap)到磁盘。 内存交换是操作系统的虚拟内存管理机制,当…

成功解决 ValueError: Unable to find resource t64.exe in package pip._vendor.distlib

解决问题 我们在本地的命令行中运行指令"python -m pip install --upgrade pip"的时候,报了如下的错误: 解决思路 我们需要重新安装一下pip。 解决方法 步骤1: 通过执行下面的指令删除本地的pip: python -m pip uninstall pip…

仓库物资出入库管理系统源码+uniapp小程序

一款基于ThinkPHPuniapp开发的仓库物资出入库管理系统,适用于单位内部物资采购、发放管理的库存管理系统。提供全部无加密源码,支持私有化部署。 更新日志: 新增 基于UNIAPP开发的手机端,适配微信小程序 新增 字典管理 新增页面…

基于机器学习的逐巷充填开采岩层运动地表沉降预测

基于机器学习的逐巷充填开采岩层运动地表沉降预测 1. 项目概述 本报告详细介绍了使用Python和机器学习技术预测逐巷充填开采过程中地表沉降的方法。通过分析地质参数、开采参数和充填参数,构建预测模型评估地表沉降风险。 # 导入必要的库 import numpy as np import pandas…

MotleyCrew ——抛弃dify、coze,手动搭建多agent工作流

1. MotleyCrew 核心组件 - 协调器: Crew MotleyCrew 的核心是一个 “Crew” 对象,即多代理系统的指挥者。Crew 持有一个全局的知识图谱(使用 Kuzu 图数据库),用于记录所有任务、任务单元和其执行状态。 Cr…

掌握这些 Python 函数,让你的代码更简洁优雅

在 Python 编程世界里,代码的简洁性与可读性至关重要。简洁优雅的代码不仅便于自己后期维护,也能让其他开发者快速理解逻辑。而 Python 丰富的内置函数和一些实用的第三方库函数,就是实现这一目标的有力武器。接下来,就为大家介绍…

简说ping、telnet、netcat

简说 ping 和 telnet 命令的作用、用法和区别,方便理解它们在网络诊断中的用途。 🌐 ping 命令 ✅ 作用: ping 用于检测网络连通性。它通过向目标主机发送 ICMP Echo 请求 并等待回应,从而判断目标主机是否可达,并测…

基于STM32的超声波模拟雷达设计

一、雷达概述 雷达(Radio Detection and Ranging,无线电探测与测距)是一种利用电磁波探测目标位置、速度等信息的主动式传感器系统。其基本原理是发射电磁波并接收目标反射的回波,通过分析回波的时间差、频率变化等参数&#xff0…

飞书多维表格利用 Amazon Bedrock AI 能力赋能业务

背景 飞书多维表格是一款功能强大的在线数据管理与协作工具。它打破传统表格局限,将电子表格与数据库特性融合,支持看板、甘特图、表单等多种视图自由切换,可根据项目进度、任务管理等不同场景灵活展示数据。其丰富的字段类型能精准适配各类…