使用遮罩时会出现MSEL

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

使用遮罩时,我正在尝试计算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个回答
0
投票

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

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()稍差一些。

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