使用我定制的损失函数,损失无法反向传播到模型的参数

问题描述 投票:0回答:1

我设计了一个定制的损失:

class CustomIndicesEdgeAccuracyLoss(torch.nn.Module):
    def __init__(self, num_classes: int, selected_indices: list):
        super(CustomIndicesEdgeAccuracyLoss, self).__init__()
        self.num_classes = num_classes
        self.selected_indices = selected_indices

    def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
        batch_size, num_classes, feature_size = input.shape
        selected_input = input[::, ::, self.selected_indices]
        selected_target = target[::, self.selected_indices]
        selected_preds = torch.argmax(selected_input, dim=1)
        edge_acc = torch.eq(selected_preds, selected_target).sum()/torch.numel(selected_preds)
        loss = 1 – edge_acc
        loss.requires_grad = True

        return loss

但是

loss
不会反向传播到模型参数,换句话说,模型参数的梯度始终为0,模型参数无法更新。 可能的原因有哪些?我该如何修改代码?

这里是

forward()
的局部变量的一些信息:

input.shape: torch.Size([64, 3, 5])
target.shape:torch.Size([64, 5])
selected_input.shape: torch.Size([64, 3, 2]) 
selected_target.shape:torch.Size([64, 2])

PS。我在here问了同样的问题,所以我会将答案从这篇文章复制到那里,反之亦然。

python pytorch loss-function
1个回答
0
投票

您不能使用准确性作为损失函数,因为它是不可微的。通过

torch.argmax
没有梯度传播。您需要使用可微损失函数。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.