pytorch autograd计算标量函数二阶导数

2023-11-05

计算标量函数: y = x 3 + s i n ( x ) y=x^3+sin(x) y=x3+sin(x)
x = 1 , π , 5 x=1,\pi,5 x=1,π,5时的一阶导 d y d x \frac{dy}{dx} dxdy和二阶导 d 2 y d x 2 \frac{d^2y}{dx^2} dx2d2y,程序代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 28 08:59:50 2020

@author: 周文青

利用torch.autograd计算单变量标量函数y=x^3+sin(x)在x分别为1,pi和5时的一阶导数和二
阶导数

"""
import torch as tc
import numpy as np

#%% 方法1:采用torch.autograd.grad
x  = tc.tensor([1, np.pi, 5],requires_grad=True)
y = x**3 +  tc.sin(x)
dy = 3*x**2 + tc.cos(x)
d2y = 6*x - tc.sin(x)

dydx = tc.autograd.grad(y, x, 
                        grad_outputs=tc.ones(x.shape), #注意这里需要人为指定
                        create_graph=True, 
                        retain_graph=True) # 为计算二阶导保持计算图
print(dydx) # 注意输出是一个tuple,取第一个元素
# (tensor([ 3.5403, 28.6088, 75.2837], grad_fn=<AddBackward0>),)
print(dy)
# tensor([ 3.5403, 28.6088, 75.2837], grad_fn=<AddBackward0>)

d2ydx2 = tc.autograd.grad(dydx[0],x, 
                          grad_outputs=tc.ones(x.shape), 
                          create_graph=False) # 默认会自动销毁计算图
print(d2ydx2)
# (tensor([ 5.1585, 18.8496, 30.9589]),)
print(d2y)
# tensor([ 5.1585, 18.8496, 30.9589], grad_fn=<SubBackward0>)

#%% 方法2:采用torch.autograd.backword
x  = tc.tensor([1, np.pi, 5],requires_grad=True)
y = x**3 +  tc.sin(x)
dy = 3*x**2 + tc.cos(x)
d2y = 6*x - tc.sin(x)

tc.autograd.backward(y, grad_tensors=tc.ones(x.shape),
           create_graph=True, retain_graph=False)
print(x.grad) #一阶导
# tensor([ 3.5403, 28.6088, 75.2837], grad_fn=<CopyBackwards>)
tc.autograd.backward(x.grad, grad_tensors=tc.ones(x.shape),
           create_graph=False, retain_graph=False)

#采用backword的方法并且在求一阶导的时候设置了create_graph时,该结果是两次梯度的累加结果
print(x.grad) 
# tensor([  8.6988,  47.4584, 106.2426], grad_fn=<CopyBackwards>)

pytorch实现了自动微分功能,可以自动计算梯度,因此后续可以研究使用pytorch实现一些利用梯度信息的优化算法,包括单变量情况和多变量情况的,例如one line search中的牛顿法梯度下降法共轭梯度算法等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch autograd计算标量函数二阶导数 的相关文章

随机推荐

  • muduo源码分析2——Singleton分析

    1 一般singleton写法 单例模式即要求只有在第一次调用的时候创建该对象 主要分为以下两条路 返回指针还是引用 返回引用可以防止使用中delete instance导致对象被提前销毁 private包含static指针以及构造函数 p
  • thinkphp 中 使用七牛云上传(来自thinkphp官网)

    利用七牛云私有空间存储文件 第一步 注册七牛云 创建空间 将空间设为私有 需要记下的东西 AK SK bucket 第二步配置ThinkPHP 在config php添加 UPLOAD SITEIMG QINIU gt array maxS
  • 电脑提示‘您需要来自Administration的权限才能对此文件夹进行更改’怎么删除文件...

    电脑提示 您需要来自Administration的权限才能对此文件夹进行更改 怎么删除文件 应该怎么做 win7系统需要定期删除一些无用的文件 扩大内存空间 但是在删除文件的时候弹出提示 您需要来自Administrators的权限才能对此
  • llvm libLLVMCore源码分析 02 - Value Class

    源码路径 llvm include llvm IR Value h llvm include llvm IR ValueHandle h llvm Value Class 在llvm中 Value类是所有程序计算出的值的类 如Argumen
  • 一个外国的好网站 http://www.ilovejackdaniels.com/

    正则表达式大区 魔兽快捷键 呵呵 转载于 https www cnblogs com yamajia archive 2007 12 04 981843 html
  • Hive 基础知识

    目录 1 基础概念 1 1 定义 1 2 组件 1 3 元数据 1 4 内部表和外部表 2 Hive与关系型数据库的对比 3 Hive 数据存储 4 参考文献 1 基础概念 1 1 定义 Hive是一个基于Hadoop的数据仓库基础设施工具
  • notepad++安装十六进制插件备注

    notepad 安装十六进制插件备注 notepad 下载地址 https notepad plus plus org notepad 16进制插件下载位置 https github com chcg NPP HexEdit release
  • QKL123

    作者 QKL123 QKL123区块链排行榜包括区块链项目 区块链交易平台 区块链媒体 区块链公众号 区块链矿机 区块链矿池 EOS Dapp ETH Dapp 区块链钱包九大榜单 相对第二期 2019年02月 榜单 该期首次新增ETH D
  • java JDWP调试接口任意命令执行漏洞

    点击 仙网攻城狮 关注我们哦 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 JDWP Java DEbugger Wire Protocol 即Java调试线协议 是一个为Java调试而设计的通讯交互协议 它定义了调试器和被调试
  • 【数据结构】一、顺序表的基本操作(C语言)

    顺序表的定义 初始化 创建 打印 按值查找 插入 时间复杂度为O n 删除 时间复杂度为O n 销毁 合并两个顺序表 include
  • AI 绘画Stable Diffusion 研究(一)sd整合包v4.2 版本安装说明

    部署包作者 秋葉aaaki 免责声明 本安装包及启动器免费提供 无任何盈利目的 大家好 我是风雨无阻 众所周知 StableDiffusion 是非常强大的AI绘图工具 需要详细了解StableDiffusion的朋友 可查看我之前的这篇文
  • IntelliJ IDEA插件的Jrebel激活踩坑【内网离线使用】

    前言 Jrebel默认是需要外网在每一次使用时实时激活的 但是我们好多情况都是内网使用 所以我查了很多资料找到了一个解决方案 Jrebel 破解方法 https www jb51 net article 199354 htm Jrebel
  • python滚动的后推任意时点

    有几个关键点 对时间的循环 可以使用pandas的date range函数 比较容易一些 后推任意时点 使用dateutil relativedelta的relativedelta 可以以准确地指定日期后推 示例代码 比如 循环2020 0
  • react+antd出现preventDefault()警告报错

    react项目遇到如下报错 This synthetic event is reused for performance reasons If you re seeing this you re accessing the method p
  • 【C++】类和对象-多态

    1 多态的基本语法 代码 include
  • 【微信小程序】小程序长按复制文本

    微信小程序的文本 要具有长按复制功能 必须满足两个条件 文本在
  • Python类、模块、包

    http www cppblog com len archive 2008 07 24 57078 html Python在处理功能复用和功能颗粒度划分时采用了类 模块 包的结构 这种处理跟C 中的类和名字空间类似 但更接近于Java所采用
  • linux开发板通过网线连接电脑(win10)连接网络问题

    最近开始学习嵌入式Linux开发 使用野火imx6ull开发板 想把开发板通过网线连接到笔记本 笔记本连接WiFi 共享使用网络 查询了很多资料后成功实现 我现在把这个方法分享出来 1 禁用防火墙功能 打开网络和共享中心 gt window
  • .net dapper简单使用

    以本地mysql数据库为例 准备工作 新建数据库 新建表 例如book表 然后定义Book类 book表和Book类应对应 这样dapper才能把他们映射好 在appsettings json中配置数据库连接 ConnectionStrin
  • pytorch autograd计算标量函数二阶导数

    计算标量函数 y x 3 s i n