复制模型输出到火炬.requires_grad为True的张量



我有一个模型,它为批处理中的每个元素输出向量序列,例如,[Batch size, Sequence Length, Hidden size]。然后,我想为批处理中的每个元素选择一个可变数量的向量,并将这些向量复制到张量中,其中requires_grad = True。示例代码如下:


from torch import nn
from typing import List
class MyModel(nn.Module):

def __init__(self):
super(MyModel, self).__init__()
self.fc = nn.Linear(8,8)

def forward(self, x: torch.Tensor, indices: List[torch.Tensor]):
# Example indices: [torch.tensor([0,1]), torch.tensor([2,3,4])]
out = self.fc(x)
batch_size, _, hidden_size = out.size()
max_num_hidden_states = max([ind.size(0) for ind in indices])
selected_hidden_states = torch.zeros(batch_size, max_num_hidden_states, hidden_size, requires_grad=True)
for i in range(batch_size):
selected_hidden_states.data[i, :indices[i].size(0)] = out[i, indices[i]]
return selected_hidden_states

model = MyModel()
with torch.no_grad():
output = model(torch.rand(2, 5, 8), [torch.tensor([0,1]), torch.tensor([2,3,4])])

我想问的问题是:

  1. 如果我训练这样的模型,梯度会在其余的模型参数中反向传播吗?
  2. 为什么output.requires_grad = True,当我明确地说torch.no_grad()?
  3. 我这样做的方式(它似乎没有像预期的那样工作到现在)似乎太hacky和错误。实现我想要的东西的正确方法是什么?

我知道这个答案,它认可了我的做法(至少看起来是这样),但对我来说,它仍然看起来很粗俗。

干杯!

从PyTorch论坛复制粘贴一个答案。

那是很久以前的事了,回答了一个不同的问题。

  1. 。在创建一个需要grad的新张量和使用。data之间,你创建了一个新的叶子,它将积累。grad。
  2. 因为你要求了。no_grad表示你不需要grad,它不包括对结果的requires_grad的保证。
  3. 如果效用函数不为你工作,删除requires_grad和.data应该做的技巧。

最新更新