小编给大家分享一下pytorch中.data与.detach()有什么区别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
众所周知,pytorch里一个tensor默认是有两个属性的,一个是data一个是grid。 但这里的data也是tensor。有的时候我们不想管梯度grid的事,所以用.data来提取这里的data。
a = torch.tensor([1,2,3.], requires_grad = True) out = a.sigmoid() c = out.data # 需要走注意的是,通过.data “分离”得到的的变量会和原来的变量共用同样的数据,而且新分离得到的张量是不可求导的,c发生了变化,原来的张量也会发生变化 c.zero_() # 改变c的值,原来的out也会改变
tensor .data 返回和 x 的相同数据 tensor,而且这个新的tensor和原来的tensor是共用数据的,一者改变,另一者也会跟着改变,而且新分离得到的tensor的require s_grad = False, 即不可求导的。(这一点其实detach是一样的)
除了.data,pytorch还提供了.detach()来实现相同的操作。不管grid的事,只提取data,可以用.detach()。而且我们更推荐使用.detach()。
a = torch.tensor([1,2,3.], requires_grad = True) out = a.sigmoid() c = out.detach() # 需要走注意的是,通过.detach() “分离”得到的的变量会和原来的变量共用同样的数据,而且新分离得到的张量是不可求导的,c发生了变化,原来的张量也会发生变化 c.zero_() # 改变c的值,原来的out也会改变
tensor .detach() 返回和 x 的相同数据 tensor,而且这个新的tensor和原来的tensor是共用数据的,一者改变,另一者也会跟着改变,而且新分离得到的tensor的require s_grad = False, 即不可求导的。(这一点其实 .data是一样的)
那么哪里不一样呢?为什么更推荐用.datach()呢?
举个例子,上面的out包含着data,也包含着grid。现在我不想管梯度的事,所以可以用out.data来把纯种tensor提取出来,此时的out.data也就是c已经没有梯度这个东西了。可我c.zero_()修改了out的值,这时再bp竟然会成功!没有梯度了竟然能bp!所以.data是有缺点的。而.detach()是没有这个问题的,所以建议用.datach()。
以上是“pytorch中.data与.detach()有什么区别”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。