Pytorch的自动微分---自动微分

# 使用pytorch的自动微分功能,只需要定义原函数f(x),不再需要定义导函数df(x)
import matplotlib.pyplot as plt
import numpy as np
import torch


def f(x):
    return x * x + 3 * x + 2


if __name__ == '__main__':
    # 使用torch.linspace生成自变量序列x
    # require_grad=True,代表张量x需要自动微分功能
    x = torch.linspace(-6.5, 3.5, 1000, requires_grad=True)
    # 计算函数值
    y_f = f(x)
    # 使用backward函数自动计算梯度
    # 这样所有的梯度值,就都会保存在x.grad中
    y_f.sum().backward()
    # 因为backward()函数只能对标量进行操作
    # 需要先使用y_f.sum,将y_f中的元素求和,将其转换为一个标量
    # 再在这个标量上调用backward,计算梯度

    # 将梯度值x.grad、函数值y_f、自变量x,从pytorch张量转换为numpy数组
    # 注意,转换前需要调用detach函数
    y_df = x.grad.detach().numpy()
    y_f = y_f.detach().numpy()
    x = x.detach().numpy()
    # detach方法会创建一个原张量的副本,该副本不会跟踪张量的梯度
    # 使用detach后,才能正常的将张量转换为numpy数组
    # 而不影响自动梯度的计算

    plt.plot(x, y_f, label='f(x)=x*x+3*x+2')
    plt.plot(x, y_df, label="f'(x)=2*x+3")
    plt.legend()  # 对图像进行标记
    plt.grid(True)  # 使用grid函数标记出网格线
    plt.show()

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YLTommi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值