【问题标题】:Copying model output to a torch.Tensor where requires_grad is True将模型输出复制到 torch.Tensor,其中 requires_grad 为 True
【发布时间】:2021-10-15 03:21:25
【问题描述】:

我有一个模型可以为批次中的每个元素输出一系列向量,例如[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])])
     

我的问题 w.r.t.这是:

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

我知道this answer,它认可我的做法(至少看起来是这样),但对我来说它仍然看起来很老套。

干杯!

【问题讨论】:

  • requires_grad=True 不足以使模型的输出可反向传播。它需要由 Torch 操作员链接到您的模型参数,这里不是这种情况。

标签: python pytorch torch autograd


【解决方案1】:

从 PyTorch 论坛复制并粘贴 answer

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

  1. 没有。在创建一个需要 grad 的新张量和使用 .data 之间(这些天您永远不应该这样做),您创建了一个将累积 .grad 的新叶子。
  2. 因为您请求它。 no_grad 表示您不需要 grad,它不包括对结果 requires_grad 的保证。
  3. 如果实用程序函数不适合您,删除 requires_grad 和 .data 应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2016-07-06
    • 2018-07-07
    • 1970-01-01
    • 2011-07-04
    • 2011-01-18
    • 2012-05-26
    相关资源
    最近更新 更多