【问题记录】RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

文章讲述了在修改神经网络的损失函数时,从BCL转换到BCE遇到的问题,以及在调试过程中发现BCE的内存地址问题。最终通过使用BCEWithLogitsLoss并调整数据处理方式解决了高初始损失问题,强调了前向传播、反向传播和梯度计算在损失计算中的关键作用。
摘要由CSDN通过智能技术生成

在对神经网络的损失函数进行修改时遇到标题中的问题

修改过程如下:

  1. 原始损失函数在网络训练框架下继承自:
class BCL(nn.Module):
    """
   批次平衡对比损失变化,-11
    """
    def __init__(self, margin=2.0):
        super(BCL, self).__init__()
        self.margin = margin
    def forward(self, distance, label):
        label[label == 255] = 1
        mask = (label != 255).float()
        distance = distance * mask
        pos_num = torch.sum((label == 1).float()) + 0.0001
        neg_num = torch.sum((label == -1).float()) + 0.0001

        loss_1 = torch.sum((1 + label) / 2 * torch.pow(distance, 2)) / pos_num
        loss_2 = torch.sum((1 - label) / 2 * mask *
                           torch.pow(torch.clamp(self.margin - distance, min=0.0), 2)
                           ) / neg_num
        loss = loss_1 + loss_2
        return loss
  1. 在修改过程中替换为BCE损失:
class BCE(nn.Module):
    def __init__(self):
        super(BCE, self).__init__()
        self.bce = nn.BCE()
    def forward(self, pred, label):
        mask = (label != 255).float()
        bce = self.bce(pred, mask)
        return bce
  1. 经过多方验证与修改,未能解决问题。

经调试发现,在传播过程中BCE在网络返回值与标签值均为内存地址,而BCL为Tensor张量可见

其中,在反向传播位置参考方法:https://blog.csdn.net/wu_xin1/article/details/116502378进行了修改,能够解决报错问题,但是能够从评论区看出该方法治标不治本,并且存在漏洞,在本实验中表现为初轮iteration损失巨巨巨高(高达97…,而正常损失之介于0…~20)

  1. 经多方查阅,采用BCEWithLogitsLoss方法,参考博客:https://www.cnblogs.com/zhangxianrong/p/14773075.html
    能够有效解决该问题

  2. 经测试发现,该处报错与损失计算时传入的结果数据有关联,由于在网络输出时,对神经网络输出结果进行了适当处理,发现在进行计算时需要传入网络类出口值(涉及前向传播反向传播与梯度计算问题)才能避免报错,同类型报错包括RuntimeError: Boolean value of Tensor with more than one value is ambiguous

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yokon_D

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值