Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn : class CustomLoss(nn.Module): def __init__(self): super(CustomLoss, self).__init__() def forward(self, predicted_tokens, target_tokens): # 设置允许梯度计算 predicted_tokens.requires_grad = True target_tokens.requires_grad = True scores = torch.zeros_like(target_tokens, dtype=torch.float32) for i in range(target_tokens.size(1)): target_token = target_tokens[:, i] max_score = torch.max(torch.eq(predicted_tokens, target_token.unsqueeze(dim=1)).float(), dim=1)[0] scores[:, i] = max_score loss = 1 - torch.mean(scores) return loss
时间: 2024-04-13 20:28:45 浏览: 159
这个错误通常是因为在计算损失函数时,某个张量没有设置梯度计算,但在反向传播时却尝试计算其梯度。为了解决这个问题,您可以将张量的`requires_grad`属性设置为`True`,以确保其梯度可以被计算。
请修改您的代码如下:
```python
class CustomLoss(nn.Module):
def __init__(self):
super(CustomLoss, self).__init__()
def forward(self, predicted_tokens, target_tokens):
# 设置允许梯度计算
predicted_tokens = predicted_tokens.requires_grad_()
target_tokens = target_tokens.requires_grad_()
scores = torch.zeros_like(target_tokens, dtype=torch.float32)
for i in range(target_tokens.size(1)):
target_token = target_tokens[:, i]
max_score = torch.max(torch.eq(predicted_tokens, target_token.unsqueeze(dim=1)).float(), dim=1)[0]
scores[:, i] = max_score
loss = 1 - torch.mean(scores)
return loss
```
在上述代码中,我们使用了`.requires_grad_()`方法来将`predicted_tokens`和`target_tokens`的`requires_grad`属性设置为`True`,以确保它们的梯度可以被计算。这样,在反向传播时就不会出现上述错误。
希望这个修改能够解决您遇到的问题!如果还有其他问题,请随时提问。