使用掩码时的 MSELoss
MSELoss when mask is used
我正在尝试计算使用掩码时的 MSELoss。假设我有 batch_size of 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
因素。有什么想法吗?
代码中存在一些问题。我认为正确的代码应该是:
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()
稍差。
我正在尝试计算使用掩码时的 MSELoss。假设我有 batch_size of 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
因素。有什么想法吗?
代码中存在一些问题。我认为正确的代码应该是:
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()
稍差。