首页 > 其他分享 >2-2自动微分机制

2-2自动微分机制

时间:2023-12-23 14:33:35浏览次数:28  
标签:1.0 tensor True torch 微分 自动 print 机制 grad

0.配置

神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情。

而深度学习框架可以帮助我们自动地完成这种求梯度的运算。

Pytorch一般通过反向传播backward方法实现这种求梯度计算。 该方法求得的梯度将存在对应自变量张量的grad属性下。

除此之外,也能够调用torch.autograd.grad函数来实现求梯度计算。

这就是Pytorch的自动微分机制。

import torch

print('torch.__version__=' + torch.__version__)

"""
torch.__version__=2.1.1+cu118
"""

1.利用backward方法求导数

backward方法通常在一个标量张量上调用,该方法求得的梯度将存在对应自变量张量的grad属性下。

如果调用的张量非标量,则要传入一个和它同形状的gradient参数张量。

相当于用该gradient参数张量与调用张量作向量点乘,得到的标量结果再反向传播。

# 标量的反向传播
import numpy as np
import torch

# f(x) = a*x**2 + b*x + c
x = torch.tensor(0.0, requires_grad=True)  # 需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x, 2) + b*x + c

y.backward()
dy_dx = x.grad
print(dy_dx)

"""
tensor(-2.)
"""

# 非标量的反向传播
x = torch.tensor([[0.0, 0.0], [1.0, 2.0]], requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x, 2) + b*x + c

gradient = torch.tensor([[1.0, 1.0], [1.0, 1.0]])
print('x:\n', x)
print('y:\n', y)
y.backward(gradient=gradient)
x_grad = x.grad
print('x_grad:\n', x_grad)

"""
x:
 tensor([[0., 0.],
        [1., 2.]], requires_grad=True)
y:
 tensor([[1., 1.],
        [0., 1.]], grad_fn=<AddBackward0>)
x_grad:
 tensor([[-2., -2.],
        [ 0.,  2.]])
"""

# 非标量的反向传播可以用标量的反向传播实现
x = torch.tensor([[0.0, 0.0], [1.0, 2.0]], requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x, 2) + b*x + c

gradient = torch.tensor([[1.0, 1.0], [1.0, 1.0]])
z = torch.sum(y * gradient)

print('x:\n', x)
print('y:\n', y)
z.backward()
x_grad = x.grad
print('x_grad:\n', x_grad)

"""
x:
 tensor([[0., 0.],
        [1., 2.]], requires_grad=True)
y:
 tensor([[1., 1.],
        [0., 1.]], grad_fn=<AddBackward0>)
x_grad:
 tensor([[-2., -2.],
        [ 0.,  2.]])
"""

2.利用autograd.grad方法求导数

x = torch.tensor(0.0, requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x, 2) + b*x + c

# create_graph设置为True将允许创建更高阶的导数
dy_dx = torch.autograd.grad(y, x, create_graph=True)[0]
print(dy_dx.data)

# 求二阶导数
dy2_dx2 = torch.autograd.grad(dy_dx, x)[0]
print(dy2_dx2)

"""
tensor(-2.)
tensor(2.)
"""

x1 = torch.tensor(1.0, requires_grad=True)
x2 = torch.tensor(2.0, requires_grad=True)

y1 = x1 * x2
y2 = x1 + x2

# 允许同时对多个自变量求导数
dy1_dx1, dy1_dx2 = torch.autograd.grad(outputs=y1, inputs=[x1, x2], retain_graph=True)
print(dy1_dx1, dy1_dx2)

# 如果有多个因变量,相当于把多个因变量的梯度结果求和
dy12_dx1, dy12_dx2 = torch.autograd.grad(outputs=[y1, y2], inputs=[x1, x2])
print(dy12_dx1, dy12_dx2)

"""
tensor(2.) tensor(1.)
tensor(3.) tensor(2.)
"""

3.利用自动微分和优化器求最小值

x = torch.tensor(0.0, requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)

optimizer = torch.optim.SGD(params=[x], lr=0.01)

def f(x):
    return a * torch.pow(x, 2) + b * x + c

for i in range(500):
    optimizer.zero_grad()
    y = f(x)
    y.backward()
    optimizer.step()

print('y=', f(x).data, ';', 'x=', x.data)

"""
y= tensor(0.) ; x= tensor(1.0000)
"""

标签:1.0,tensor,True,torch,微分,自动,print,机制,grad
From: https://www.cnblogs.com/lotuslaw/p/17923098.html

相关文章

  • 解决layui表单中按钮自动提交的问题
    原文链接:https://blog.csdn.net/Mirror_r/article/details/80968696layui表单中的按钮会自动提交,这是一个很麻烦的事情。这几天项目中多次用到表单按钮,仔细研究了下,找到了解决办法:1、如果不需要放在表单中的按钮,最好不要放在表单中,不在layui的form中的按钮就不会进行自动提......
  • 25.自动化测试架构优化
    打造测试框架的需求与价值领域模型适配:封装业务实现,实现业务管理提高效率:降低用例维护成本,提高执行效率增强功能:解决已有框架不满足的情况自动化框架应具备的功能支持管理用例,运行用例支持查找元素/定位元素,对元素/页面进行各种操作(点击,滑动,输入等等)支持生成测试报告......
  • 随机幸运号码自动生成器之Python宝典【上】
    一、前言需求背景描述前面我编写了一段能生成随机幸运号码的代码,但是并不实用,每次去买颜色艳丽的票之前都需要在PyCharm上运行并将幸运号码在控制台打印出来为解决这个问题,尝试使用Python的ttkbootstrap实现简单的号码展示,并根据当前日期展现对应类型(超级彩票、彩色球票)的幸运号码,......
  • java接口自动化测试实战003----fastjson处理传入参数为JSON格式数据
    一、fastjson概述1、概述   fastjson是阿里爸爸开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。2、常用API   fastjsonAPI入口类是com.alibaba.fastjson.JSON,常......
  • java接口自动化测试实战002----测试数据封装及ExcelUtil优化
    一、利用testNG测试框架进行封装1、封装实现新建测试类,类中新增多个方法,每个方法存储一条测试数据并调用HttpUtl类中的doGet或doPost方法。缺点:代码复杂、繁琐,且不适用测试数据量大的情况。2、封装步骤(1)maven的pom.xml文件中添加testNG测试框架的依赖,如下所示:<!--https://......
  • java接口自动化测试实战004----分表存储接口信息和用例信息之CaseUtil和RestUtil
    一、分表存储用例信息和接口信息1、实现思想  将用例相关信息存储在用例表单中,将接口信息存储在接口信息表单中,创建对应的类存储表单中的信息。2、实现步骤(1)修改表格文件,分表存储用例信息和接口信息,如下图所示:     (2)修改ExcelUtil中的读取函数datas,让表单名称......
  • python自动化学习笔记5-----allure测试报告
    1、运行测试报告 2、allure注解的使用  3、优化测试报告之添加对应的标签 4、注解的使用     5、yaml文件格式 6、更改logo(1)allure目录下找到allure.yml的文件,增加插件    (2)在插件目录下添加要展示的图片    (3)修改styles.cs......
  • python自动化学习笔记6-----jekins环境搭建及使用
        msi版本安装后,要去电脑服务里面设置为自启动,否则重启电脑后使用不了。  web自动化1、实现linux部署jekins,window运行自动化代码,不在同一个机器上运行在执行机(自己的电脑上)访问jekins网址进行相应设置        运行后,进行连接,连接成功后,小......
  • python自动化学习笔记4-----pytest单元测试框架
            ......
  • [Qt5&布局] 控件自动填满所在布局框架
    作者:丶布布如图,在界面布局时,将几个QT控件进行布局时,默认边缘时有一定间隙的(红框标注),有时为了美观,可以将布局边缘的间隙设置成我们想要的宽度具体设置方法:默认边缘间隙为11,设置为1,看一下效果: 戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。......