将模型输出复制到 torch.Tensor,其中 requires_grad 为 True
Copying model output to a torch.Tensor where requires_grad is True
我有一个模型可以为批次中的每个元素输出一系列向量,例如 [Batch size, Sequence Length, Hidden size]
。然后,我想为批次中的每个元素 select 可变数量的向量,并将这些向量复制到 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。这是:
- 如果我训练这样的模型,梯度会在其余模型参数中反向传播吗?
- 当我明确说明
torch.no_grad()
时,为什么 output.requires_grad = True
?
- 我这样做的方式(目前它似乎没有按预期工作)似乎太老套和错误了。实现我想要的目标的正确方法是什么?
我知道 this answer,它支持我的做法(至少看起来是这样),但对我来说它仍然看起来很老套。
干杯!
从 PyTorch 论坛复制粘贴 answer。
那是很久以前回答不同问题的。
- 没有。在创建需要 grad 的新张量和使用 .data(这些天你永远不应该这样做)之间,你创建了一个新的叶子,它将累积 .grad。
- 因为你要求了。 no_grad 表明您不需要毕业,它不包括对结果 requires_grad 的保证。
- 如果效用函数对您不起作用,删除 requires_grad 和 .data 应该可以解决问题。
我有一个模型可以为批次中的每个元素输出一系列向量,例如 [Batch size, Sequence Length, Hidden size]
。然后,我想为批次中的每个元素 select 可变数量的向量,并将这些向量复制到 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。这是:
- 如果我训练这样的模型,梯度会在其余模型参数中反向传播吗?
- 当我明确说明
torch.no_grad()
时,为什么output.requires_grad = True
? - 我这样做的方式(目前它似乎没有按预期工作)似乎太老套和错误了。实现我想要的目标的正确方法是什么?
我知道 this answer,它支持我的做法(至少看起来是这样),但对我来说它仍然看起来很老套。
干杯!
从 PyTorch 论坛复制粘贴 answer。
那是很久以前回答不同问题的。
- 没有。在创建需要 grad 的新张量和使用 .data(这些天你永远不应该这样做)之间,你创建了一个新的叶子,它将累积 .grad。
- 因为你要求了。 no_grad 表明您不需要毕业,它不包括对结果 requires_grad 的保证。
- 如果效用函数对您不起作用,删除 requires_grad 和 .data 应该可以解决问题。