AttributeError: ‘MSELoss‘ object has no attribute ‘backward‘解决方案

本文讲述了作者在使用PyTorch时遇到的问题,由于对MSELoss函数理解不深,误将损失计算和反向传播分开,导致loss未被正确更新。博主分享了解决方法,提醒读者注意函数返回值并确保loss对象的正确操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题我亲身经历,搞了好久,才发现错误,根本原因就是对代码,pytorch等的原理理解不够深入。
my_loss(my_y, y)函数忘记给返回值(loss)了,还错误的把my_loss进行backward操作了,因此MSELoss对象没有backward,正确解决办法如最下面的图,loss = my_loss(my_y, y)给个返回值,然后在写loss.backward()方法
错误写法如下:

my_loss = torch.nn.MSELoss()

for my_step in range(max_for + 1):
    my_y = my_net(x)
    my_optim.zero_grad()
    my_loss(my_y, y)

    my_loss.backward()
    my_optim.step()

正确写法如下:

my_loss = torch.nn.MSELoss()

for my_step in range(max_for + 1):
    my_y = my_net(x)
    my_optim.zero_grad()
    loss = my_loss(my_y, y)

    loss.backward()
    my_optim.step()
### 解决方案 当遇到 `AttributeError: 'Focal_Loss' object has no attribute 'backward'` 的错误时,这通常是由于自定义损失函数类的设计不当引起的。为了使自定义的损失函数能够正常工作并支持反向传播,必须确保该类继承自 `torch.nn.Module` 并实现 `_forward` 方法。 具体来说,在创建 `Focal_Loss` 类时,应该遵循以下几点: - 继承自 `torch.nn.Module` 以利用 PyTorch 提供的功能。 - 使用 `super().__init__()` 来初始化父类[^4]。 - 定义前向计算逻辑于 `forward` 函数内而不是直接在类体中执行[^2]。 下面是修正后的代码示例: ```python import torch import torch.nn as nn import torch.nn.functional as F class FocalLoss(nn.Module): def __init__(self, alpha=1, gamma=2, reduction='mean'): super(FocalLoss, self).__init__() self.alpha = alpha self.gamma = gamma self.reduction = reduction def forward(self, inputs, targets): BCE_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduce=False) pt = torch.exp(-BCE_loss) F_loss = self.alpha * (1-pt)**self.gamma * BCE_loss if self.reduction == 'sum': return torch.sum(F_loss) elif self.reduction == 'mean': return torch.mean(F_loss) else: return F_loss ``` 使用此改进版本的 `FocalLoss` 后,可以通过如下方式调用其 `backward` 方法而不会引发上述异常: ```python focal_loss = FocalLoss() for step in range(max_steps + 1): outputs = model(inputs) optimizer.zero_grad() loss_value = focal_loss(outputs, labels) # 获取loss值 loss_value.backward() # 执行反向传播 optimizer.step() ``` 通过以上调整,可以有效避免因缺少必要的类成员而导致的 `AttributeError` 错误,并使得自定义的焦点损失能够在训练过程中正确地参与梯度下降过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值