You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现Charbonnier损失时loss.backward()报错:floor_divide导数未实现

问题解决:Charbonnier损失反向传播触发floor_divide导数未实现错误

你的问题根源在于Python浮点数形式的epsilon与张量运算时触发了隐式的底层整数除法操作,而PyTorch未实现该操作的反向传播。以下是具体的修复方案:

修复方案:将epsilon转为同设备同dtype的张量

修改损失函数,确保epsilon始终与输入张量pred/truth保持相同的设备(CPU/GPU)和数据类型,避免隐式类型转换带来的问题。

修改后的代码示例

class CharbonnierLoss(nn.Module):
    def __init__(self, epsilon=1e-3):
        super().__init__()
        self.epsilon_val = epsilon

    def forward(self, pred, truth):
        # 动态创建与输入同设备、同dtype的epsilon张量
        eps = torch.tensor(self.epsilon_val, device=pred.device, dtype=pred.dtype)
        return torch.mean(torch.sqrt((pred - truth)**2 + eps**2))

或者也可以在初始化时就将epsilon转为张量,在forward中同步设备:

class CharbonnierLoss(nn.Module):
    def __init__(self, epsilon=1e-3):
        super().__init__()
        self.epsilon = torch.tensor(epsilon)

    def forward(self, pred, truth):
        eps = self.epsilon.to(pred.device).to(pred.dtype)
        return torch.mean(torch.sqrt((pred - truth)**2 + eps**2))

额外检查项

  • 确认pred和truth的 dtype 为浮点类型(如torch.float32/torch.float64),如果是整数类型,运算过程中也可能触发整数除法相关的反向传播问题。

内容的提问来源于stack exchange,提问作者claudio schiavella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:09:56