如何在PyTorch中使用平均相对绝对误差损失函数替换MSE
PyTorch实现平均相对绝对误差损失的方法
核心结论
- PyTorch官方
torch.nn模块没有内置平均相对绝对误差(Mean Relative Absolute Error, MARE/MRAE)损失函数,你找到的实现属于PyTorch Ignite扩展库的贡献指标模块,不属于核心nn包,因此无法通过nn.前缀直接调用。
实现方案
方案1:手动自定义损失(推荐)
该方案无需额外安装依赖,适配性更强,直接继承nn.Module即可实现和内置损失完全一致的调用逻辑:
import torch import torch.nn as nn class MeanRelativeAbsoluteError(nn.Module): def __init__(self, epsilon: float = 1e-8): super().__init__() # 加入极小值epsilon避免target为0时出现除以0的数值错误 self.epsilon = epsilon def forward(self, y_pred: torch.Tensor, y_true: torch.Tensor) -> torch.Tensor: abs_error = torch.abs(y_pred - y_true) relative_error = abs_error / (torch.abs(y_true) + self.epsilon) return torch.mean(relative_error)
修改你原有代码的损失调用部分即可,将nn.MSELoss()替换为自定义的损失类:
# 训练和验证阶段损失都替换为以下写法 L = MeanRelativeAbsoluteError() loss = L(out, targets)
你可以根据自己数据集的数值范围调整epsilon的大小,避免数值不稳定。
方案2:调用PyTorch Ignite的实现
如果需要使用官方提供的实现,需要先安装PyTorch Ignite扩展库,再对应导入使用:
- 安装依赖:
pip install pytorch-ignite - 导入调用:
from ignite.contrib.metrics.regression import MeanAbsoluteRelativeError
注意Ignite提供的该类默认是指标类,如果要作为损失函数反向传播,需要提取计算结果并保证梯度传递,自定义方案更适合训练场景。
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

