pytorch Hubber Loss 计算不匹配

问题描述 投票:0回答:1

所以我有两个矩阵需要计算 hubber 损失,我的预测 x 和我的标签 y 如下: 他们的形状分别回归

x.shape = torch.Size([16, 3])

y.shape = torch.Size([16, 3])

当我使用以下方法从矩阵中提取零值时:

    Z = x[y!=0]
    Y = y[y!=0]

它们的形状变成 torch.Size([47]) 他们丢失了一个样本,因为它是空的,所以它们的内容如下:

Z:
        tensor([-0.0458177179,  0.0794119537,  0.0132298730, 
        -0.0684378445,  0.0239270329, -0.0998859257,
        -0.0052077156, -0.0251933523,  0.0673011318, 
        -0.0612106398, -0.0158440936, -0.0163329616,
        -0.0501042753, -0.0480697751,  0.0425285585,
        -0.0132632162, -0.0011744332, -0.0364661291, 
        -0.0337458402, -0.0496659800,  0.0198419951, 
        -0.0582559109,  0.0249673352, -0.0003011823,         
        -0.0630656779, -0.0028106403, -0.0478336737,  
         0.0248849690, -0.0248453412, -0.0383186191, 
        -0.0145248026, -0.0016013812, -0.0033918321, 
        -0.0392261222, -0.0121430475, -0.0213719532, 
        -0.0376458839, -0.0001880229,  0.0371584892,  
         0.0006527156,  0.0143199209, -0.0159018263, 
        -0.0016747080, -0.1677681506, 
        -0.1180625483, -0.0595825985, -0.0515905097], grad_fn=<IndexBackward0>)

Y:
        tensor([35.7957916260, 21.6673698425,  9.7700004578, 
          34.3571853638, 22.8384342194, 12.3599996567,
          32.5878181458, 19.4447669983, 17.7210159302,
          34.8954925537, 21.9499092102, 12.2500000000,
          31.5930919647, 22.8414421082,  9.0699996948,
          33.4950599670, 22.7711448669, 10.4899997711,
          34.4383850098, 21.3011169434, 12.8400001526,
          36.1783103943, 20.6615600586, 10.4700002670,
          35.6059494019, 21.8775119781, 12.0799999237,
          32.5706367493, 25.7370777130, 10.4099998474,
          34.3967170715, 22.7617359161, 8.9700002670,
          35.6082382202, 22.0040664673,  9.6199998856,
          34.3121032715, 22.4560070038, 10.2299995422,
          34.3565788269, 20.7696933746, 10.2200002670,
          38.5010910034, 23.5856552124, 
          34.1491165161, 22.1938228607,  9.5699996948])
    loss = nn.functional.huber_loss(Z, Y)

当我计算损失时,我得到结果张量(22.3675804138,grad_fn=HuberLossBackward0) 但为了我的需要,我必须分别计算三个类别中每个类别的损失,我这样做

for i in range(x.shape[1]):
            loss1 += nn.functional.huber_loss(x[y[:,i]!=0,i], y[y[:,i]!=0,i])
            
loss1 = loss1/x.shape[1]

首先,我取出任何为零的数字(如之前所做的那样),然后选择每个类,并计算三个类的损失,将它们相加,然后将它们除以类的数量,得到损失张量( 22.1220340729, grad_fn=DivBackward0),类内容打印如下:

class 0 X:
        tensor([-0.0458177179, -0.0684378445, -0.0052077156, -0.0612106398,
        -0.0501042753, -0.0132632162, -0.0337458402, -0.0582559109,
        -0.0630656779,  0.0248849690, -0.0145248026, -0.0392261222,
        -0.0376458839,  0.0006527156, -0.0016747080, -0.1180625483],
       grad_fn=<IndexBackward0>) 
class 0 Y:
       tensor([35.7957916260, 34.3571853638, 32.5878181458, 34.8954925537,
        31.5930919647, 33.4950599670, 34.4383850098, 36.1783103943,
        35.6059494019, 32.5706367493, 34.3967170715, 35.6082382202,
        34.3121032715, 34.3565788269, 38.5010910034, 34.1491165161])
class 1 X:
 tensor([ 0.0794119537,  0.0239270329, -0.0251933523, -0.0158440936,
        -0.0480697751, -0.0011744332, -0.0496659800,  0.0249673352,
        -0.0028106403, -0.0248453412, -0.0016013812, -0.0121430475,
        -0.0001880229,  0.0143199209, -0.1677681506, -0.0595825985],
       grad_fn=<IndexBackward0>) 
class 1 Y:
 tensor([21.6673698425, 22.8384342194, 19.4447669983, 21.9499092102,
        22.8414421082, 22.7711448669, 21.3011169434, 20.6615600586,
        21.8775119781, 25.7370777130, 22.7617359161, 22.0040664673,
        22.4560070038, 20.7696933746, 23.5856552124, 22.1938228607])
class 2 X:
 tensor([ 0.0132298730, -0.0998859257,  0.0673011318, -0.0163329616,
         0.0425285585, -0.0364661291,  0.0198419951, -0.0003011823,
        -0.0478336737, -0.0383186191, -0.0033918321, -0.0213719532,
         0.0371584892, -0.0159018263, -0.0515905097], 
         grad_fn=<IndexBackward0>) 
class 2 Y:
 tensor([ 9.7700004578, 12.3599996567, 17.7210159302, 12.2500000000,
         9.0699996948, 10.4899997711, 12.8400001526, 10.4700002670,
        12.0799999237, 10.4099998474,  8.9700002670,  9.6199998856,
        10.2299995422, 10.2200002670,  9.5699996948])

尽管所有数字都匹配,但损失仍存在 0,2455463409 的差异,有谁知道为什么会发生这种情况?也许存在某种舍入误差?还是我做错了什么?

python deep-learning pytorch neural-network
1个回答
0
投票

您会得到不同的结果,因为您进行了不同的计算:在前者中,您对

X
Y
中的所有元素进行平均,在后者中,您对所有 classes 进行平均,这意味着元素的权重不同平均而言,因为并非所有类都具有相同数量的元素。

© www.soinside.com 2019 - 2024. All rights reserved.