pytorch中copy()clone()detach()
Torch 为了提⾼速度,向量或是矩阵的赋值是指向同⼀内存的
如果需要开辟新的存储地址⽽不是引⽤,可以⽤clone()进⾏深拷贝
区别
clone()
解释说明: 返回⼀个原张量的副本,同时不破坏计算图,它能够维持反向传播计算梯度,
并且两个张量不共享内存.⼀个张量上值的改变不影响另⼀个张量.
copy_()
解释说明: ⽐如x4.copy_(x2), 将x2的数据复制到x4,并且会
修改计算图,使得反向传播⾃动计算梯度时,计算出x4的梯度后
再继续前向计算x2的梯度. 注意,复制完成之后,两者的值的改变互不影响,
因为他们并不共享内存.
detach()
解释说明: ⽐如x4 = x2.detach(),返回⼀个和原张量x2共享内存的新张量x4,
两者的改动可以相互可见, ⼀个张量上的值的改动会影响到另⼀个张量.
返回的新张量和计算图相互独⽴,即新张量和计算图不再关联,
因此也⽆法进⾏反向传播计算梯度.即从计算图上把这个张量x2拆
卸detach下来,⾮常形象.
detach_()
解释说明: detach()的原地操作版本,功能和detach()类似.
⽐如x4 = x2.detach_(),其实x2和x4是同⼀个对象,返回的是self,
x2和x4具有相同的id()值.
例⼦
a = sor([[1.,2.,3.],[4.,5.,6.]], requires_grad=True)
print(a)
b=a.detach()
print(b)
"""
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
tensor([[1., 2., 3.],
[4., 5., 6.]])
"""
detach()操作后的tensor与原始tensor共享数据内存,当原始tensor在计算图中数值发⽣反向传播等更新之后,detach()的tensor值也发⽣了改变
a = sor([[1.,2.,3.],[4.,5.,6.]], requires_grad=True)
print(a)
b=a.clone()
print(b)
"""
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
tensor([[1., 2., 3.],
[4., 5., 6.]], grad_fn=<CloneBackward>)
"""
grad_fn=<CloneBackward>表⽰clone后的返回值是个中间变量,因此⽀持梯度的回溯。
a = sor([[1.,2.,3.],[4.,5.,6.]], requires_grad=True)
print(a)
b=a.detach().clone()
print(b)
"""
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
tensor([[1., 2., 3.],
[4., 5., 6.]])
"""
a = sor([[1.,2.,3.],[4.,5.,6.]], requires_grad=True) print(a)
b=a.detach().clone().requires_grad_(True)
print(b)
"""
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
"""
clone()操作后的tensor requires_grad=True detach()操作后的tensor requires_grad=False import torch
torch.manual_seed(0)
x= sor([1., 2.], requires_grad=True)
clone_x = x.clone()
detach_x = x.detach()
clone_detach_x = x.clone().detach()
f = Linear(2, 1)
y = f(x)
y.backward()
ad)
print(quires_grad)
print(ad)
print(quires_grad)
print(clone_quires_grad)
'''
输出结果如下:
tensor([-0.0053,  0.3793])
True
cloneNone
False
False
'''

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。