zoukankan      html  css  js  c++  java
  • tensor中的data()函数与detach()的区别

    tensor中的data()函数与detach()的区别

    detach()和data生成的都是无梯度的纯tensor,并且通过同一个tensor数据操作,是共享一块数据内存。

    import torch
    t1 = torch.tensor([0,1.],requires_grad=True)
    t2=t1.detach()
    t3=t1.data
    print(t2.requires_grad,t3.requires_grad)
    ---------------------------------------------
    output: False, False
    

    x.data和x.detach()新分离出来的tensor的requires_grad=False,即不可求导时两者之间没有区别,但是当当requires_grad=True的时候的两者之间的是有不同:x.data不能被autograd追踪求微分,但是x.detach可以被autograd()追踪求导。

    x.data

    import torch
    a = torch.tensor([1,2,3.], requires_grad=True)
    out = a.sigmoid()
    out 
    ----------------------------------------------------
    output: tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
    
    c = out.data
    c
    -----------------------------------------------------
    output: tensor([0.7311, 0.8808, 0.9526])
    
    c.zero_()    # 归0化
    out
    ------------------------------------------------------
    tensor([0., 0., 0.], grad_fn=<SigmoidBackward>)
    
    out.sum().backward()
    a.grad
    -------------------------------------------------------
    output:tensor([0., 0., 0.])
    

    x.detach()

    b = torch.tensor([1,2,3.], requires_grad=True)
    out1 = b.sigmoid()
    out1
    ------------------------------------------------------
    output:tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
    
    c1 = out1.detach()
    c1
    ------------------------------------------------------
    output:tensor([0.7311, 0.8808, 0.9526])
    
    c1.zero_()
    out1.sum().backward()   # 报错是是因为autograd追踪求导的时候发现数据已经发生改变,被覆盖。
    -------------------------------------------------------
    output: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation:
    

    总结:

    x.data和x.detach()都是从原有计算中分离出来的一个tensor变量 ,并且都是inplace operation.在进行autograd追踪求倒时,两个的常量是相同。

    不同:.data时属性,detach()是方法。 x.data不是安全的,x.detach()是安全的。

    参考:
    https://zhuanlan.zhihu.com/p/83329768
    https://blog.csdn.net/qq_27825451/article/details/96837905

  • 相关阅读:
    《面试系列一》一个怂到极点的开始
    NuGet 私房服务使用帮助
    Nuspec 范本文件
    送给前线码农的话 – 大牛们的经典语录
    Visual Studio 增加源码头注释
    为 Orchard 增加 MVC 的脚手架.
    为 Orchard 增加扩展的存储位置
    Orchard 瘦身优化
    Hybrid Multiple Attention Network for Semantic Segmentation in Aerial Images
    【nvidia jetson xavier】 Linux系统安装+Deepstream 5.1环境部署
  • 原文地址:https://www.cnblogs.com/my-recode/p/12305250.html
Copyright © 2011-2022 走看看