我的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
答案 0 :(得分:0)
因为默认情况下,当在标量上调用它时,会将import threading, subprocess
def cmd():
cmd = int(input(''))
if cmd == 1:
tJournal.start()
def journal():
with open('temp.rtf', 'w+') as temp:
pass
subprocess.run('temp.rtf', shell=True)
tJournal = threading.Thread(target=journal)
while __name__=='__main__':
cmd()
作为向后函数的输入。如果它是一个具有多个元素的张量,则应将[1]
作为向后的输入。
[1,1,....1]
或
loss.backward(torch.Tensor([1, 1, 1, 1, 1, 1, ... ,1]))
1的数量= 1D张量中元素的数量。
回答为什么我们使用均值和全部,因为它充当归一化术语。我们没有使单个批次的所有损失受到巨大影响,而是将其影响归一化。这有问题吗?不会。相反,通过缩放比例,我们对损耗曲线的行为有了更合理的认识。