为何PyTorch中mse_loss计算结果与手动直接计算相差2倍?
为什么torch.nn.functional.mse_loss的计算结果和手动计算的均方误差有差异?
你会发现torch.nn.functional.mse_loss(x1,x2)的结果和手动计算的MSE不一致,甚至是手动结果除以维度数(比如示例中是2)的结果,核心原因是两者的计算逻辑不同:
测试代码
import torch import numpy as np # x1为预测的2D坐标,x2为真实坐标 x1 = torch.rand(10,2) x2 = torch.rand(10,2) mse_torch = torch.nn.functional.mse_loss(x1,x2) print(mse_torch) # 示例输出:0.1557 mse_direct = torch.nn.functional.pairwise_distance(x1,x2).square().mean() print(mse_direct) # 示例输出:0.3314 mse_manual = 0 for i in range(len(x1)) : mse_manual += np.square(np.linalg.norm(x1[i]-x2[i])) / len(x1) print(mse_manual) # 示例输出:0.3314
差异原因
- torch的mse_loss逻辑:对张量中所有元素的平方差求平均。比如示例中(10,2)的张量,会计算10×2=20个元素的平方差,再取这20个值的平均值。
- 手动计算的逻辑:先对每个样本计算坐标的L2范数平方(即该样本两个维度的平方差之和),再对所有样本(共10个)的结果求平均。
用单个样本举例:假设x1=[a,b],x2=[c,d]
- mse_loss计算的是
[(a-c)² + (b-d)²] / 2 - 手动计算的是
[(a-c)² + (b-d)²] / 1(再对所有样本平均)
所以两者的结果比值恰好等于样本的维度数(示例中是2),和你观察到的现象一致。
让mse_loss和手动计算结果一致的方法
如果想让mse_loss输出和手动计算相同的结果,可以先对平方差求和,再除以样本数量:
mse_torch_adjusted = torch.nn.functional.mse_loss(x1, x2, reduction='sum') / len(x1)
内容的提问来源于stack exchange,提问作者csstudent1418
相关产品推荐
相关产品推荐

