我是pytorch的新手。我读了很多pytorch代码,这些代码大量使用了张量的.data
成员。但是我在官方文档和Google中搜索.data
,却发现很少。我猜.data
包含张量中的数据,但是我不知道何时需要它,何时不需要它?
答案 0 :(得分:6)
.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
是从网站获取基础Tensor
的主要方法Variable
。合并之后,调用y = x.data
仍然具有类似的功能 语义。因此y
将是一个Tensor
,它与x
,与x
的计算历史无关,并且具有requires_grad=False
。但是,
.data
在某些情况下可能是不安全的。x.data
上的任何更改autograd
不会跟踪,计算出的梯度将是 如果在向后传递中需要x
,则错误。一个更安全的选择是 使用x.detach()
,它还会返回共享数据的Tensor
与requires_grad=False
一起使用,但会就地更改 如果autograd
向后需要x
,则由"apps": [ { "root": "src", "outDir": "dist", "assets": [ "assets" // <<< ], }]
报告。
答案 1 :(得分:0)
除了@benjaminplanche 的回答,我会用它来手动更改参数的值。
例如,我有以下模型:
model = nn.Sequential(nn.Linear(10, 1))
出于某种原因,我想手动更新其参数的值。然后,我可以这样做:
for param in model.parameters():
param.data = 10 * param.data # multiply the parameter values by 10.
请注意,如果我们删除 .data
后面的 param
,参数值将不会更新。
这种用法可以在 BYOL (Bootstrap your own latent) 和 this Github webpage for BYOL pytorch implementation 中找到。