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

  • 相关阅读:
    Asp.net 自定义config文件读取
    sql 两个数字范围取随机数
    数据库中一些简单的防刷机制
    sql日期操作收集
    全文索引工作收集
    JQuery Div滚动条插件 jScroll
    OLE DB 访问接口 'Microsoft.Jet.OLEDB.4.0' 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询
    vs 高级保存选项的设置
    Web.config配置文件详解
    JS,Jquery获取各种屏幕的宽度和高度
  • 原文地址:https://www.cnblogs.com/leejack/p/8373211.html
Copyright © 2011-2022 走看看