使用掩模时的 MSELoss

inv*_*dex 5 loss backpropagation neural-network pytorch

我正在尝试计算使用掩码时的 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()
Run Code Online (Sandbox Code Playgroud)

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

Uma*_*pta 6

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

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()
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!我之前也考虑过这个解决方案,因为对所有元素(零和非零)取平均值对我来说没有意义。 (2认同)