.data 在 pytorch 中仍然有用吗?
Posted
技术标签:
【中文标题】.data 在 pytorch 中仍然有用吗?【英文标题】:Is .data still useful in pytorch? 【发布时间】:2019-01-15 12:19:59 【问题描述】:我是 pytorch 的新手。我阅读了很多 pytorch 代码,这些代码大量使用了张量的 .data
成员。但是我在官方文档和谷歌中搜索.data
,发现很少。我猜.data
包含张量中的数据,但我不知道我们什么时候需要它,什么时候不需要?
【问题讨论】:
【参考方案1】:.data
是Variable
的属性(表示Tensor
的对象,具有历史跟踪,例如用于自动更新),而不是Tensor
。实际上,.data
正在授予对Variable
底层Tensor
的访问权限。
但是,由于 PyTorch 版本 0.4.0
、Variable
和 Tensor
已合并(成为更新的 Tensor
结构),所以 .data
沿之前的 Variable
对象消失了(好吧 Variable
是仍然存在向后兼容,但已弃用)。
Release Notes 中的段落0.4.0
(我建议阅读有关Variable
/Tensor
更新的整个部分):
.data
呢?
.data
是从Variable
。这次合并之后,调用y = x.data
还是有类似的 语义。所以y
将是一个Tensor
,它与x
,与x
的计算历史无关,并且有requires_grad=False
.但是,
.data
在某些情况下可能不安全。x.data
的任何更改autograd
不会跟踪,计算的梯度是 如果在向后传递中需要x
,则不正确。更安全的选择是 使用x.detach()
,它还返回一个共享数据的Tensor
使用requires_grad=False
,但将进行就地更改 由autograd
报告,如果在后面需要x
。
【讨论】:
【参考方案2】:除了@benjaminplanche 的回答,我会用它来手动更改参数值。
例如,我有以下模型:
model = nn.Sequential(nn.Linear(10, 1))
出于某种原因,我想手动更新其参数的值。然后,我可以这样做:
for param in model.parameters():
param.data = 10 * param.data # multiply the parameter values by 10.
请注意,如果我们删除param
后面的.data
,参数值将不会更新。
这种用法可以在BYOL (Bootstrap your own latent)和this Github webpage for BYOL pytorch implementation找到。
【讨论】:
以上是关于.data 在 pytorch 中仍然有用吗?的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch源码解读之torch.utils.data.DataLoader(转)
Pytorch - 这是使用 pytorch.data.Dataset 加载大数据集并对其进行线性回归训练的正确方法吗