ErikTse Runtime

  • 首页 / Home
  • | 算法学习 / Algorithm
    • 所有 / All
    • 简单 / Easy
    • 中等 / Medium
    • 困难 / Hard
  • | 技术分享 / Technology
    • 所有 / All
    • 网络技术 / NetWork
    • 资源共享 / Resource
    • 项目实践 / Event
  • ETOJ在线评测系统
Keep Going.
温故而知新.
  1. 首页
  2. 技术分享
  3. 学科学习
  4. 正文

[Pytorch]机器学习入门项目笔记:自动微分(2)

2022年9月1日 127点热度 0人点赞 0条评论

记录Pytorch的autograd功能,可能涉及的函数有:

  • tensor.requires_grad_(True) #动态修改跟踪
  • d = torch.autograd.grad(z, y, grad_outputs=torch.ones_like(y))
  • z.backward() #反向传播

创建矩阵Tensor

下面是两种创建Tensor的方法。

x = torch.tensor([[0.0, 1.0], [1.1, 2.2]], requires_grad=True)
y = torch.ones(2, 1).clone().detach().requires_grad_(True)

矩阵乘法

直接写 x * y得到的是哈达玛积,可以参考这篇文章《pytorch tensor 乘法运算汇总与解析_程序之巅的博客-CSDN博客_tensor相乘》

利用函数torch.matmul(x, y)求得的才是x和y矩阵相乘的结果。

z = torch.matmul(x, y)

自动微分(求导)

Pytorch提供了强大的API可以对变量进行自动微分。

利用函数torch.autograd.grad(z, x)可以求得\(\frac{\partial z}{\partial x}\),但是如果x是一个矩阵,z也是一个矩阵的话,需要提前规定梯度输出的格式,传入参数grad_outputs=[构造对应大小的全1矩阵]即可。

import torch
# 创建图
x = torch.tensor([[0.0, 1.0], [1.1, 2.2]], requires_grad=True)
y = torch.ones(2, 1).clone().detach().requires_grad_(True)
z = torch.matmul(x, y)
k = torch.autograd.grad(z, y, grad_outputs=torch.ones_like(y))
print(k)  # 打印: dz/dy

反向传播

通过tensor.backward()方法,可以将某个tensor前面的所有变量全部微分得到梯度,但是只能使用一次,再次使用需要将所有梯度归零且第一次使用要保留图。

import torch
x = torch.tensor(2.0, requires_grad=True)
z = x ** 3
z.backward()
print(x.grad)  # 打印: dz/dx

参考文章《pytorch报错详解:RuntimeError: Trying to backward through the graph a second time_糖豆豆今天也要努力鸭的博客-CSDN博客》

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: autograd python pytorch tensor 反向传播 机器学习 深度学习 自动微分
最后更新:2022年9月1日

Eriktse

18岁,性别未知,ACM-ICPC现役选手,ICPC亚洲区域赛银牌摆烂人,CCPC某省赛铜牌蒟蒻,武汉某院校计算机科学与技术专业本科在读。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

Eriktse

18岁,性别未知,ACM-ICPC现役选手,ICPC亚洲区域赛银牌摆烂人,CCPC某省赛铜牌蒟蒻,武汉某院校计算机科学与技术专业本科在读。

文章目录
  • 创建矩阵Tensor
  • 矩阵乘法
  • 自动微分(求导)
  • 反向传播

友情链接 | 站点地图

COPYRIGHT © 2022 ErikTse Runtime. ALL RIGHTS RESERVED.

Theme Kratos | Hosted In TENCENT CLOUD

赣ICP备2022001555号-1

赣公网安备 36092402000057号