我的loss
输出是
tensor([0.0430, 0.0443, 0.0430, 0.0430, 0.0443, 0.0466, 0.0466, 0.0466],
grad_fn=<AddBackward0>)
[执行loss.backward()
时,我获得了*** RuntimeError: grad can be implicitly created only for scalar outputs
[在某些地方,他们建议使用loss.mean().backward()
或loss.sum().backward()
。
为什么使用.mean().backward()
,即,如果通常应平均梯度(而不是损失),为什么要对批次中所有元素的损失求平均?
这里是我的code
由于默认情况下,当在标量上调用它时,会将[1]
作为后向函数的输入传递。如果它是一个具有多个元素的张量,则应将[1,1,....1]
作为输入传递给后向。
loss.backward(torch.Tensor([1, 1, 1, 1, 1, 1, ... ,1]))
或
loss.backward(torch.ones(batch_size))
个数=您所用一维张量中的元素数。
回答为什么我们使用均值和全部,因为它充当归一化术语。我们没有使单个批次的所有损失受到巨大影响,而是将其影响归一化。这有问题吗?不会。相反,通过缩放比例,我们对损耗曲线的行为有了更合理的认识。