【问题标题】:MSELoss when mask is used使用掩码时的 MSELoss
【发布时间】:2020-08-18 03:49:57
【问题描述】:

我正在尝试在使用掩码时计算 MSELoss。假设我有一个 batch_size 为 2:[2, 33, 1] 的张量作为我的目标,以及另一个具有相同形状的输入张量。由于每个实例的序列长度可能不同,因此我还有一个二进制掩码,指示输入序列中每个元素的存在。所以这就是我正在做的事情:

mse_loss = nn.MSELoss(reduction='none')

loss = mse_loss(input, target)
loss = (loss * mask.float()).sum() # gives \sigma_euclidean over unmasked elements

mse_loss_val = loss / loss.numel()

# now doing backpropagation
mse_loss_val.backward()

loss / loss.numel() 是一个好习惯吗?我持怀疑态度,因为我必须使用reduction='none',并且在计算最终损失值时,我认为我应该只考虑那些非零(即未屏蔽)的损失元素来计算损失,但是,我取平均值所有带有torch.numel() 的张量元素。我实际上是在尝试考虑 MSELoss 的1/n 因素。有什么想法吗?

【问题讨论】:

    标签: neural-network pytorch backpropagation loss


    【解决方案1】:

    代码中存在一些问题。我认为正确的代码应该是:

    mse_loss = nn.MSELoss(reduction='none')
    
    loss = mse_loss(input, target)
    loss = (loss * mask.float()).sum() # gives \sigma_euclidean over unmasked elements
    
    non_zero_elements = mask.sum()
    mse_loss_val = loss / non_zero_elements
    
    # now doing backpropagation
    mse_loss_val.backward()
    

    如果您担心数字错误,这仅比使用 .mean() 稍差。

    【讨论】:

    • 谢谢!我之前也在考虑这个解决方案,因为对所有元素(零和非零)取平均值对我来说没有意义。
    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多