MSELoss при использовании маски - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь вычислить 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(). Я на самом деле пытаюсь принять во внимание 1/n фактор MSELoss. Есть мысли?

1 Ответ

0 голосов
/ 03 мая 2020

В коде есть некоторые проблемы. Я думаю, что правильный код должен быть:

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(), если вы беспокоитесь о числовых ошибках.

...