十堰网站建设专家,机房建设 网站,查询网站的外链,网站建设经验分享文章目录 序言相同点不同点测试实例应用 序言
.detach()和.data都可以用来分离tensor数据#xff0c;下面进行比较pytorch0.4及之后的版本#xff0c;.data仍保留#xff0c;但建议使用.detach()
相同点
x.detach()和x.data返回和x相同数据的tensor#xff0c;这个新的t… 文章目录 序言相同点不同点测试实例应用 序言
.detach()和.data都可以用来分离tensor数据下面进行比较pytorch0.4及之后的版本.data仍保留但建议使用.detach()
相同点
x.detach()和x.data返回和x相同数据的tensor这个新的tensor和原来的tensor共用数据一者改变另一者也会跟着改变新分离得到的tensor的requires_grad False, 即不可求导的
不同点
(1) .data是一个属性.detach()是一个方法(2) x.data不能被autograd追踪求微分即使被改了也能错误求导x.detach()也不能被autograd追踪求微分被改了会直接报错避免错误的产生(3) .data是不安全的.detach()是安全的
测试实例 .data测试 import torcha torch.tensor([1 ,2 ,3.], requires_grad True) # float类型,支持求导
out a.sigmoid()
print(out) # 输出(0.0, 1.0)结果
b out.data # 分离tensor
b.zero_() # 改变b的值原来的out也会改变
print(b.requires_grad) # .data后requires_gradFalse
print(b) # 归0后的值 tensor([0., 0., 0.])
print(out.requires_grad) # out的requires_gradTrue
print(out) # b的值改变了out也变了 tensor([0., 0., 0.])
print(----------------------------------------------)out.sum().backward() # 对原来的out求导
print(a.grad) # 不会报错但结果不正确更改分离之后的变量值b导致原来的张量out的值也跟着改变但是这种改变对于autograd是没有察觉的它依然按照求导规则来求导导致得出完全错误的导数值却浑然不知它的风险性就是如果我再任意一个地方更改了某一个张量求导的时候也没有通知我已经在某处更改了导致得出的导数值完全不正确 .detach()测试 import torcha torch.tensor([4, 5, 6.], requires_gradTrue)
out a.sigmoid()
print(out)
c out.detach()
c.zero_() # 改变c的值原来的out也会改变
print(c.requires_grad) # detach后requires_gradFalse
print(c) # 已经归0
print(out.requires_grad) # 输出为True
print(out)
print(----------------------------------------------)out.sum().backward() # 对原来的out求导
print(a.grad) # 此时会报错: 梯度计算所需要的张量已经被“原位操作inplace”所更改了# RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation更改分离之后的变量值c导致原来的张量out的值也跟着改变这个时候如果依然按照求导规则来求导由于out已经更改了所以不会再继续求导了而是报错这样就避免了得出错误的求导结果
应用
forward时使用.data或.detach()不进行梯度计算和梯度跟踪backward时梯度回传不能使用.detach()或.data比如loss信息被detach的话就无法进行梯度回传更新参数会导致模型无法收敛 【参考文章】 [1]. .detach和.data的区别和作用 [2]. .detach和.data的区别 [3]. .detach和.data求导时的区别
created by shuaixio, 2024.02.24