zoukankan      html  css  js  c++  java
  • pytorch0.4版本的重大更新

    torch中Variable和Tensor合并 4 import torch
     5 from torch.autograd import Variable # torch 中 Variable 模块
     6 
     7 tensor = torch.FloatTensor([[1,2],[3,4]])
     8 variable = Variable(tensor)
     9 
    #原本0.4就是varibale(参数)用来给张量绑定梯度张量,可以记录其梯度变化。如果不是varibale,没有绑定梯度张量,无法记录梯度。
    #后面就直接用tensor(required = True)来指定给其绑定梯度! 10 print(tensor) 11 print(variable) 13 结果如下: 14 tensor([[1., 2.], 15 [3., 4.]]) 16 tensor([[1., 2.], 17 [3., 4.]]) 18 发现tensor和variable输出的形式是一样的,在新版本的torch中可以直接使用tensor而不需要使用variable。 19 20 在旧版本中variable和tensor的区别在于,variable可以进行误差的反向传播,而tensor不可以。 21 22 接下来看一下,合并Tensor和Variable之后autograd是如何实现历史追踪和反向传播的 23 24 作为能否autograd的标签,requires_grad现在是Tensor的属性,所以,只要当一个操作(operation)的任何输入Tensor具有requires_grad = True的属性,autograd就可以自动追踪历史和反向传播了。 25 26 官方给出的具体例子如下: 27 28 29 # 默认创建requires_grad = False的Tensor 30 x = torch.ones(1) # create a tensor with requires_grad=False (default) 31 x.requires_grad 32 # out: False 33 34 # 创建另一个Tensor,同样requires_grad = False 35 y = torch.ones(1) # another tensor with requires_grad=False 36 # both inputs have requires_grad=False. so does the output 37 z = x + y 38 # 因为两个Tensor x,y,requires_grad=False.都无法实现自动微分, 39 # 所以操作(operation)z=x+y后的z也是无法自动微分,requires_grad=False 40 z.requires_grad 41 # out: False 42 43 # then autograd won't track this computation. let's verify! 44 # 因而无法autograd,程序报错 45 z.backward() 46 # out:程序报错:RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn 47 48 # now create a tensor with requires_grad=True 49 w = torch.ones(1, requires_grad=True) 50 w.requires_grad 51 # out: True 52 53 # add to the previous result that has require_grad=False 54 # 因为total的操作中输入Tensor w的requires_grad=True,因而操作可以进行反向传播和自动求导。 55 total = w + z 56 # the total sum now requires grad! 57 total.requires_grad 58 # out: True 59 # autograd can compute the gradients as well 60 total.backward() 61 w.grad 62 #out: tensor([ 1.]) 63 64 # and no computation is wasted to compute gradients for x, y and z, which don't require grad 65 # 由于z,x,y的requires_grad=False,所以并没有计算三者的梯度 66 z.grad == x.grad == y.grad == None 67 # True

    关于 .data

    .data 是从 Variable 中获取底层 Tensor 的主要方式。 合并后,调用 y = x.data 仍然具有相似的语义。因此 x.data将返回新的requires_grad=False且与 x 共享内存的 Tensor,它与 x 的计算历史无关;关键它会强制x不再进行梯度更新

    然而,在某些情况下 .data 可能不安全。 对 x.data 的任何更改都不会被 autograd 跟踪,如果在反向过程中需要 x,那么计算出的梯度将不正确。

    另一种更安全的方法是使用 x.detach(),它也返回一个与 requires_grad = False 时共享数据的 Tensor,但如果x需要梯度更新,x依然可以自动更新梯度。

    Tensor 中 type () 的变化

    这里需要注意到张量的 type()不再反映数据类型,而是改用 isinstance() 或 x.type() 来表示数据类型

    关于volatile

    新版本中,volatile 标志将被弃用且不再会有任何作用。先前的版本中,任何涉及到 volatile = True 的 Variable 的计算都不会由 autograd 追踪到。

    这已经被一组更灵活的上下文管理器所取代,包括 torch.no_grad(),torch.set_grad_enabled(is_train/True/False)等等

    torch.device

    torch.device 包含设备类型('cpu'或'cuda')及可选的设备序号(id)。它可以通过 torch.device('{device_type}') 或 torch.device('{device_type}:{device_ordinal}')来初始化所选设备。

    如果设备序号不存在,则用当前设备表示设备类型:例如,torch.device('cuda')等同于 torch.device('cuda:X'),其中 x 是 torch.cuda.current_device()的结果。

    https://www.cnblogs.com/z1141000271/p/9473096.html

  • 相关阅读:
    C:把算术表达式分成Token
    JavaScript数据结构——链表的实现与应用
    JavaScript数据结构——队列的实现与应用
    JavaScript数据结构——栈的实现与应用
    由“RangeError: Invalid status code: 0”错误所引发的思考
    工作是最好的投资——图书摘录
    Node.js在指定的图片模板上生成二维码图片并附带底部文字说明
    苹果手机对网页上样式为position:fixed的弹窗支持不好的解决办法
    自定义react数据验证组件
    Ubuntu 18.04中截图工具Shutter的编辑按钮不可用的解决办法
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12787071.html
Copyright © 2011-2022 走看看