zoukankan      html  css  js  c++  java
  • Pytorch自动求解梯度

    要理解Pytorch求解梯度,首先需要理解Pytorch当中的计算图的概念,在计算图当中每一个Variable都代表的一个节点,每一个节点就可以代表一个神经元,我们只有将变量放入节点当中才可以对节点当中的变量求解梯度,假设我们有一个矩阵:

    1., 2., 3.
    4., 5., 6.

    我们将这个矩阵(二维张量)首先在Pytorch当中初始化,并且将其放入计算图当中的节点当中,在Pytorch当中,一个节点用Variable来表示,因此可以编写如下代码:

    import torch
    from torch.autograd import Variable
    
    # 我们创建的是一个二维张量(即矩阵)而不是标量,因此会报错
    # 在Pytorch当中,仅允许标量对标量或者 标量对向量(或者张量)求解偏导数
    x=Variable(torch.Tensor([[1., 2., 3.], [4., 5., 6.]]), requires_grad=True)

    在节点当中,拥有requires_grad的参数,系统默认是False,也就是不能对其中的变量求解梯度,但是我们需要里面变量的梯度,因此需要将整个参数命名为True。

    最后我们写出其他变量有关x的表达式:

    y=2*x*x+2
    
    j=y.mean()

    这样就得到了j的值,这是一个标量,因为mean表示的求解平均值,在Pytorch当中只能够标量对标量,或者标量对张量求解偏导数,否则就会报错。

    现在我们的计算图模型就搭建完毕了,整个模型当中只有一个节点,其他的表示相当于神经元当中的权重,以及J代表loss函数,我们调用Pytorch当中的反向传播函数backward(),对x关于j的梯度进行求解,代码如下:

    j.backward()

    这样梯度就求解完毕了,我们打印出x关于j的梯度的值,后面的参数x.grad表示求解出来的x的梯度大小:

    print("x的梯度是:",x.grad)

    输出:

    x的梯度是: 
    tensor([[0.6667, 1.3333, 2.0000], [2.6667, 3.3333, 4.0000]]

    得解!

  • 相关阅读:
    解决document.execCommand执行fontSize不能超过48px的问题
    JS实现值复制
    DGIS之遥感影像数据获取
    Chrome获取微信授权,调试公众号页面
    【Three.js】如何选中外部模型
    【Three.js】模型抗锯齿处理
    【Three.js】实现随心所欲的展示外部三维模型
    【GIS新探索】算法实现在不规则区域内均匀分布点
    WebGIS简单实现一个区域炫酷的3D立体地图效果
    【GIS新探索】GeoHash原理和编解码实现
  • 原文地址:https://www.cnblogs.com/geeksongs/p/12678625.html
Copyright © 2011-2022 走看看