Я пытаюсь вычислить 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. Есть мысли?