DL 2 自动微分模块

news/2025/11/18 21:54:36/文章来源:https://www.cnblogs.com/00zjy00/p/19232318

自动微分模块

1. 自动微分模块=对损失函数求导,结合反向传播,更新权重参数w,b

pytorch不支持向量张量对向量张量的求导,只支持标量张量对向量张量的求导
import torch# 定义参数,requires_grad默认为false
w = torch.tensor(10, requires_grad=True, dtype=torch.float32)# 定义损失函数
loss = w ** 2 + 20
print(f'梯度函数类型:{type(loss.grad_fn)}')
print(f'权重初始值w:{w}, loss:{loss}')for i in range(0, 10):# 计算损失loss = w ** 2 + 20# 梯度清零 w.grad.zero_(), 默认梯度会累加# 至此(第一次的时候),还没有计算梯度, 所以w.grad = Node,要做非空判断if w.grad is not None:w.grad.zero_()# 反向传播,计算梯度,梯度 = 损失函数的倒数,计算完毕后,会记录到w.grad属性中# loss是一个标量,若非标量可通过loss.sum().backward()来保证loss是1个标量loss.backward()  # 更新参数# .data 返回一个与原始张量共享相同数据存储的新张量,但不共享计算历史和梯度信息。# w.data = w.data - w.grad * 0.01# 不推荐使用data,推荐使用以下# 注意:w = w - 0.01 * w.grad 错误,因为当你执行 w = w - 0.01 * w.grad 时,# 实际上创建了一个新的张量,这个新张量不再需要梯度(因为在 torch.no_grad() 上下文中创建),所以后续的循环迭代中无法计算梯度。with torch.no_grad():w -= 0.01 * w.grad # 使用 -= 进行原地更新print(f'第{i}次,更新后的权重w:{w}, loss:{loss}')

2.detach()

若张量允许自动微分则不能转换为numpy,需要使用detach拷贝一份
另外,detach后与原变量共享同一块空间

import torch
import numpy as npt1 = torch.tensor([10, 20], requires_grad=True, dtype=torch.float)
print(f't1:{t1}, type:{type(t1)}') # t1:tensor([10., 20.], requires_grad=True), type:<class 'torch.Tensor'># 通过 detach(),拷贝一份张量,然后转换
# t2 = t1.detach().numpy()
# 注意: t1 和 t2 和 t3 共享同一块空间
t2 = t1.detach()
t3 = t2.numpy()
# 测试 共享同一块空间
t1.data[0] = 1
print(f't1:{t1}, type:{type(t1)}') # t1:tensor([ 1., 20.], requires_grad=True), type:<class 'torch.Tensor'>
print(f't2:{t2}, type:{type(t2)}') # t2:tensor([ 1., 20.]), type:<class 'torch.Tensor'>
print(f't3:{t3}, type:{type(t3)}') # t3:[ 1. 20.], type:<class 'numpy.ndarray'>
#测试 detach
print(f't1:{t1.requires_grad}') # True
print(f't2:{t2.requires_grad}') # False

3. PyTorch构建线性回归模型

import torch
from torch.utils.data import TensorDataset  # 创建x和y张量数据集对象
from torch.utils.data import DataLoader  # 创建数据集加载器
import torch.nn as nn  # 损失函数和回归函数
from torch.optim import SGD  # 随机梯度下降函数, 取一个训练样本算梯度值
from sklearn.datasets import make_regression  # 创建随机样本, 工作中不使用
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号# 1-创建线性回归样本 x y coef(w) b
# numpy对象 ->张量Tensor ->数据集对象TensorDataset ->数据加载器DataLoader
def create_datasets():x, y, coef = make_regression(n_samples=100,  # 样本数n_features=1,  # 特征数noise=10,  # 标准差, 噪声, 样本离散程度coef=True,  # 返回系数, wbias=14.5,  # 截距 brandom_state=0)# 将数组转换成张量x = torch.tensor(data=x)y = torch.tensor(data=y)# print('x->', x)# print('y->', y)# print('coef->', coef)return x, y, coef# 2-模型训练
def train(x, y, coef):# 创建张量数据集对象datasets = TensorDataset(x, y)print('datasets->', datasets)# 创建数据加载器对象# dataset: 张量数据集对象# batch_size: 每个batch的样本数# shuffle: 是否打乱样本dataloader = DataLoader(dataset=datasets, batch_size=16, shuffle=True)print('dataloader->', dataloader)# for batch in dataloader:  # 每次遍历取每个batch样本# 	print('batch->', batch)  # [x张量对象, y张量对象]# 	break# 创建初始回归模型对象, 随机生成w和b, 元素类型为float32# in_features: 输入特征数 1个# out_features: 输出特征数 1个model = nn.Linear(in_features=1, out_features=1)print('model->', model)# 获取模型对象的w和b参数print('model.weight->', model.weight)print('model.bias->', model.bias)print('model.parameters()->', list(model.parameters()))# 创建损失函数对象, 计算损失值criterion = nn.MSELoss()# 创建SGD优化器对象, 更新w和boptimizer = SGD(params=model.parameters(), lr=0.01)# 定义变量, 接收训练次数, 损失值, 训练样本数epochs = 100loss_list = []  # 存储每次训练的平均损失值total_loss = 0.0train_samples = 0for epoch in range(epochs):  # 训练100次# 借助循环实现 mini-batch SGD 模型训练for train_x, train_y in dataloader:# 模型预测# train_x->float64# w->float32y_pred = model(train_x.type(dtype=torch.float32))  # y=w*x+bprint('y_pred->', y_pred)# 计算损失值, 调用损失函数对象# print('train_y->', train_y)# y_pred: 二维张量# train_y: 一维张量, 修改成二维张量, n行1列# 可能发生报错, 修改形状# 修改train_y元素类型, 和y_pred类型一致, 否则发生报错loss = criterion(y_pred, train_y.reshape(shape=(-1, 1)).type(dtype=torch.float32))print('loss->', loss)# 获取loss标量张量的数值 item()# 统计n次batch的总MSE值total_loss += loss.item()# 统计batch次数train_samples += 1# 梯度清零optimizer.zero_grad()# 计算梯度值loss.backward()# 梯度更新 w和b更新# step()等同 w=w-lr*gradoptimizer.step()# 每次训练的平均损失值保存到loss列表中loss_list.append(total_loss / train_samples)print('每次训练的平均损失值->', total_loss / train_samples)print('loss_list->', loss_list)print('w->', model.weight)print('b->', model.bias)# 绘制每次训练损失值曲线变化图plt.plot(range(epochs), loss_list)plt.title('损失值曲线变化图')plt.grid()plt.show()# 绘制预测值和真实值对比图# 绘制样本点分布plt.scatter(x, y)# 获取1000个样本点# x = torch.linspace(start=x.min(), end=x.max(), steps=1000)# 计算训练模型的预测值y1 = torch.tensor(data=[v * model.weight + model.bias for v in x])# 计算真实值y2 = torch.tensor(data=[v * coef + 14.5 for v in x])plt.plot(x, y1, label='训练')plt.plot(x, y2, label='真实')plt.legend()plt.grid()plt.show()x, y, coef = create_datasets()
train(x, y, coef)

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

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

相关文章

NSSCTF刷题日记

2025.11.18 刚开始使用这个网站,感觉像。。。付费制洛谷?(会员制) 先白嫖做几道看看吧。 [SWPUCTF 2021 新生赛]简简单单的逻辑 好水的题,题目给出了一个 python 文件,打开就能看到源代码。点击查看代码 flag = …

《计算机网络》学习心得

一、学习背景与学习目标 《计算机网络》是我们计算机专业人才培养体系中不可或缺的核心基础课,它如同搭建专业知识大厦的“地基”,贯穿于软件开发、系统运维、网络安全、云计算等多个核心职业方向。无论是未来从事后…

2025防晒品牌TOP8精准推荐:按肤质与场景科学选择

2025防晒品牌TOP8精准推荐:按肤质与场景科学选择一、2025 年中国防晒产品品牌推荐榜(附榜单) 选购防晒霜的核心逻辑是肤质匹配 + 场景适配,没有万能产品。以下基于 2025 年天猫 618 防晒霜热卖榜、亚洲皮肤健康联盟…

黑马程序员SpringCloud微服务开发与实战- Docker基础-02

黑马程序员SpringCloud微服务开发与实战- Docker基础-02Posted on 2025-11-18 21:49 心默默言 阅读(0) 评论(0) 收藏 举报1. 常见命令

详细介绍:UE4_Niagara基础实例—15、粒子发射器之间的通信

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年目前口碑好的继承官司律师律所有哪些,遗产继承律师事务所/北京最好的继承律师/婚姻律师事务所/继承律师/北京继承纠纷律师律所哪家强

专业法律服务市场深度观察 随着社会经济发展和民众法律意识提升,遗产继承纠纷案件呈现逐年上升趋势。在北京这样的一线城市,继承官司涉及标的额大、法律关系复杂,对律师团队的专业能力提出更高要求。本文基于公开数…

老友记第一季人物表

老友记第一季人物表

五、平台设备与平台驱动

一、概述平台总线是一个虚拟总线,抽象层面上外设可以通过平台总线与CPU相连 平台设备和平台驱动就像一个人字一样挂在平台总线两侧,当一个新的平台设备或平台驱动被注册进系统,会在另一条枝干上搜索对应的平台驱动或…

make指定安装目录

make install DESTDIR=/home/tc/work/

【转载】银河麒麟(Kylin)操作系统上移植Qt 5.6.3与QtCreator 4.2.0的完整指南

转自:银河麒麟(Kylin)操作系统上移植Qt 5.6.3与QtCreator 4.2.0的完整指南-百度开发者中心 银河麒麟(Kylin)操作系统上移植Qt 5.6.3与QtCreator 4.2.0的完整指南 作者:谁偷走了我的奶酪2024.01.18 08:38浏览量:117 …

wsl 与 docker相关内容

设置 WSL 开机启动并在后台运行 来源原文 新建一个 wsl-d.vbs 文件(文件命名随意)作为启动脚本,里面内容如下: set ws=wscript.CreateObject("wscript.shell") ws.run "wsl -d Ubuntu-22.04",…

2025.11.18模拟赛

赛时因为发现T1暴力都假了,心态炸了 于是不出意外的分很低 T1赛场上剩1h30min发现是个诈骗题 就是把排列分成两个部分,使得每个部分都满足那个限制 发现很像csp2024T3 然后想优化,设dp状态,但是会算重,赛后想了半…

linux c 开发 工具

在 Linux 系统中,C 语言开发工具和环境非常丰富,以下是一些常用的 C 开发工具和相关命令,适用于大多数 Linux 发行版(如 Ubuntu、CentOS、Fedora 等):一、C 语言开发环境 1. 编译器GCC(GNU Compiler Collection…

第一章 拓扑空间与连续映射

第一章 拓扑空间与连续映射好的,我将严格按照尤承业《基础拓扑学讲义》第一章第一节的内容,为每个概念、命题和例子提供完整的证明,并用更形象的方式进行讲解。 🧭 拓扑空间的定义与公理 📚 定义1.1(拓扑空间)…

JOISC 口糊记录

JOISC 2017 烟花棒 二分答案后可以转化为该问题:两个队列 \(A,B\) 和一个变量 \(t\),每次从一个队列头弹出一个值加到 \(t\) 上。问是否能在 \(t\) 处处 \(\ge 0\) 的情况下将两个队列弹完。 首先如果存在一个最小前…

基于epoll的io复用管理,一种文件监听方案 2 - 教程

基于epoll的io复用管理,一种文件监听方案 2 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

Token快过期的三种续期方案 - 详解

Token快过期的三种续期方案 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

重组蛋白科研试剂技术综述:结构特性、功能机制与实验体系应用

重组蛋白作为生命科学研究的核心科研试剂,已成为现代实验体系中不可或缺的基础材料。它们通过基因工程技术表达、纯化而成,具有结构明确、批次稳定、功能可控等特点,使科研人员能够在体外模拟体内信号环境,研究细胞…

linux c 命令

当然可以!你提到的是“Linux C 命令”,这可能是指在 Linux 系统中使用 C 语言编写的命令或脚本,或者是使用 C 语言进行系统调用、进程管理、文件操作等。以下是一些常见的 Linux C 命令和相关功能的解释,帮助你更好…

日总结 28

Java C/S 架构的开发与打包为.exe: 一、Java C/S 架构开发核心 架构拆分 客户端:负责 UI 交互(Swing/JavaFX)、本地逻辑处理、网络请求发送。 服务器端:处理核心业务逻辑(Spring Boot/Netty)、数据存储(MySQL/…