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因为是模型输出,是带有梯度的。

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

最后的处理方式;


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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值