• 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]]

    得解!

  • 相关阅读:
    百度brpc 压测工具rpc_press解析
    Reactor反应器模式 (epoll)
    hive和hbase的区别
    Hive和HBase
    入门HBase,看这一篇就够了
    Docker保存修改后的镜像
    怎样将本地文件上传到docker容器
    Docker 安装tomcat访问空白页问题解决办法
    Centos中查看系统信息的常用命令
    Docker 镜像加速
  • 原文地址:https://www.cnblogs.com/geeksongs/p/12678625.html
Copyright © 2020-2023  润新知