AUTOGRAD: 自动分化(pytorch官网60分钟闪电战第二节)
import torch
文章目录
一、Tensor
该节使用了跟踪张量,当对x进行设置requires_grad=True,那么后续对x的操作都要转换为含x的公式,这样就体现了跟踪这一含义。
# 创建一个张量并设置requires_grad=True为跟踪张量
x = torch.ones(2, 2, requires_grad=True)
print(x)
# 用户自己创建的没有grad_fn
print(x.grad_fn)
# 进行张量运算
y = x + 2
# y是由于操作而创建的,因此具有grad_fn
print(y)
print(y.grad_fn)
# 进行更多操作 y
z = y * y * 3
out = z.mean()
print(z, out)
# requires_grad 就地更改现有Tensor的标志。输入标志默认为False
a = torch.ones(2, 2)
print(a)
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
# 对应位相承,和torch.mul相同,不是矩阵相乘,矩阵相乘是torch.mm
b = a * a
print(b)
b = b.sum()
print(b)
print(b.grad_fn)
二、Gradients
# 1.创建一个张量并设置requires_grad=True为跟踪张量
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
# print(out)
# 完成计算后,可以调用.backward()并自动计算所有梯度
out.backward()
# 该张量的梯度将累加到.grad属性中,结果应该是z=3(x+2)^2中的x求偏导,最后除以张量大小4,具体过程可参考pytorch官网介绍
# print(x.grad)
# 2.向量雅可比积
x = torch.randn(3, requires_grad=True)
print(x)
print(x.mean())
y = x * 2
# 其实就是先对y中每一项取平方,之后累加,最后取根号
# y.data.norm() = torch.sqrt(torch.sum(torch.pow(y,2)))
i = 0
while y.data.norm() < 1000:
y = y * 2
i += 1
print(i)
print(y)
v = torch.tensor([2, 1, 1], dtype=torch.float)
# 如果只想要向量-雅可比积,只需将向量传递给 backward作为参数:
y.backward(v)
print(x.grad)
print(x.requires_grad)
print((x ** 2).requires_grad)
with torch.no_grad():
print((x ** 2).requires_grad)
print(x.requires_grad)
# 要停止张量跟踪历史记录,可以调用.detach()将其从计算历史记录中分离出来,并防止跟踪将来的计算。
y = x.detach()
print(y.requires_grad)
print(x.eq(y).all())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix