zoukankan      html  css  js  c++  java
  • 【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分

    在PyTorch中,集中于所有神经网络的是autograd包。首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络。

    autograd包为张量的所有操作提供了自动微分。它是一个运行式定义的框架,这意味着你的后向传播是由你的代码运行方式来定义的,并且每一个迭代都可以是不同的。

    下面,让我们使用一些更简单的术语和例子来解释这个问题。

    0x01 变量(Variable)

    autograd.Variableautograd包的核心类,它封装了一个张量,并支持几乎所有在该张量上定义的操作。一旦完成了你的计算,你可以调用.backward(),它会自动计算所有梯度。

    你可以通过.data属性访问原始的张量,而梯度w.r.t.这个变量被累积到.grad

    还有一个类对于autograd的实现非常重要——一个函数。

    变量和函数是相互联系的,并建立一个非循环图,它编码了计算的一个完整历史。每个变量都有一个.grad_fn属性,该属性引用了一个创建了该变量的函数(除了由用户创建的变量之外,它们的grad_fnNone)。

    如果你想计算导数,你可以在一个变量上调用.backward()。如果变量是一个标量(也就是说它包含一个元素数据),那么你不需要为backward()指定任何参数,但是如果它有更多元素,那么你需要指定一个grad_output参数,该参数是一个匹配形状的张量。

    import torch
    from torch.autograd import Variable
    

    创建一个变量:

    x = Variable(torch.ones(2, 2), requires_grad=True)
    print(x)
    

    输出结果:

    Variable containing:
     1  1
     1  1
    [torch.FloatTensor of size 2x2]
    

    做一个变量操作:

    y = x + 2
    print(y)
    

    输出结果:

    Variable containing:
     3  3
     3  3
    [torch.FloatTensor of size 2x2]
    

    y是由于操作而创建的,所以它有一个grad_fn

    print(y.grad_fn)
    

    输出结果:

    <AddBackward0 object at 0x7ff91b4f0908>
    

    y做更多操作:

    z = y * y * 3
    out = z.mean()
    
    print(z, out)
    

    输出结果:

    Variable containing:
     27  27
     27  27
    [torch.FloatTensor of size 2x2]
     Variable containing:
     27
    [torch.FloatTensor of size 1]
    

    0x02 梯度(Gradients)

    现在我们介绍后向传播,out.backward()等效于做out.backward(torch.Tensor([1.0]))

    out.backward()
    

    打印梯度d(out)/dx:

    print(x.grad)
    

    输出结果:

    Variable containing:
     4.5000  4.5000
     4.5000  4.5000
    [torch.FloatTensor of size 2x2]
    

    你应该得到一个元素为4.5的矩阵。我们将这个变量叫做"o"。此时,我们有:

    你可以利用梯度做很多疯狂的事情!

    x = torch.randn(3)
    x = Variable(x, requires_grad=True)
    
    y = x * 2
    while y.data.norm() < 1000:
        y = y * 2
    
    print(y)
    

    输出结果:

    Variable containing:
      164.9539
     -511.5981
    -1356.4794
    [torch.FloatTensor of size 3]
    
    gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
    y.backward(gradients)
    
    print(x.grad)
    

    输出结果:

    Variable containing:
      204.8000
     2048.0000
        0.2048
    [torch.FloatTensor of size 3]
    

    扩展阅读: 变量和函数的文档在这里http://pytorch.org/docs/autograd

    以上脚本的总运行时间为:0分0.009秒。
     
    本文中所使用的Python代码:autograd_tutorial.py

  • 相关阅读:
    很多Python新手教程
    NYOJ 58 步数最少 【BFS】
    页面背景图像的代码
    1001. 杀死吸引力(3n+1)猜想 (15)(ZJUPAT 数学)
    使用JasperReport+iReport进行Web报表开发
    Android学习路径——Android的四个组成部分activity(一)
    1001
    android 拍照注意问题
    springMVC注解优化
    JDBC batch批处理Statement executeBatch 具体解释
  • 原文地址:https://www.cnblogs.com/leejack/p/8373211.html
Copyright © 2011-2022 走看看