Я новичок в pytorch. Я читал много кода pytorch, который сильно использует тензорный член .data
. Но ищу .data
в официальном документе и в гугле, мало нахожу. Я предполагаю, что .data
содержит данные в тензоре, но я не знаю, когда они нам нужны, а когда нет?
.Data по-прежнему полезен в pytorch?
Ответы (2)
.data
был атрибутом Variable
(объект, представляющий Tensor
с отслеживанием истории, например, для автоматического обновления), а не Tensor
. Фактически, .data
давал доступ к Tensor
, лежащему в основе Variable
.
Однако, поскольку PyTorch версии 0.4.0
, Variable
и Tensor
были объединены (в обновленную структуру Tensor
), .data
исчез вместе с предыдущим объектом Variable
(ну, Variable
все еще существует для обратной совместимости, но не рекомендуется).
Абзац из примечания к выпуску для версии 0.4.0
(я рекомендую прочитать весь раздел о _16 _ / _ 17_ обновлений):
А как насчет
.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
требуется в обратном направлении.
Помимо ответа @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) и эта веб-страница Github для реализации BYOL pytorch.