BCELoss() RuntimeError: the derivative for ‘target‘ is not implemented

        解决方案见最后。。。。。。。。。。。。。。

        最近复现模型的过程中,因为有段时间没有写工程了,非常生疏。写的过程漏洞百出,碰到这个问题,主要是利用 torch.nn.BCELoss( ) 计算损失的时候出现。

for iter, (feas, labels) in enumerate(train_dataloader, 1):
    
    optimizer.zero_grad()
    # 1. 正向
    outputs = model(feas)
    # 2. loss求解
    loss = loss_fn(labels, outputs.squeeze())
    loss_sum += loss.item()
    # 3. 梯度回传

    loss.backward()
    optimizer.step()

        印象中之前没有遇到这个问题,怀疑是版本迭代问题,网上找到方案大多是说明 BCELoss的第二个参数 的不具有梯度,所以要想这样用就是需要对 output 去梯度。

outputs.squeeze().detach()

        但是仔细一想,看到源码的中说明的第二个参数是target,loss 问题的target应该就是 label才对,而且label是不带梯度的,而 output因为是模型输出,是带有梯度的。

BCELoss() RuntimeError: the derivative for ‘target‘ is not implemented_第1张图片

 所以,调换左右 loss 计算参数的顺序就好了,我人傻了....

最后的处理方式;


    loss = loss_fn(outputs.squeeze(), labels)

你可能感兴趣的:(python,pytorch)