.data 在 pytorch 中仍然有用吗?

Posted

技术标签:

【中文标题】.data 在 pytorch 中仍然有用吗?【英文标题】:Is .data still useful in pytorch? 【发布时间】:2019-01-15 12:19:59 【问题描述】:

我是 pytorch 的新手。我阅读了很多 pytorch 代码,这些代码大量使用了张量的 .data 成员。但是我在官方文档和谷歌中搜索.data,发现很少。我猜.data 包含张量中的数据,但我不知道我们什么时候需要它,什么时候不需要?

【问题讨论】:

【参考方案1】:

.dataVariable 的属性(表示Tensor 的对象,具有历史跟踪,例如用于自动更新),而不是Tensor。实际上,.data 正在授予对Variable 底层Tensor 的访问权限。

但是,由于 PyTorch 版本 0.4.0VariableTensor 已合并(成为更新的 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 加载大数据集并对其进行线性回归训练的正确方法吗

在没有 JavaScript 的情况下优雅降级仍然有用吗?

在 pytorch 中修改预训练模型时,旧的权重会重新初始化吗?

pyTorch:如何重置其状态?

Pytorch-DataLoader(数据迭代器)