报错信息

在程序中我的损失函数定义如下所示:

loss = nn.CrossEntropyLoss(reduction='none')

但在执行loss.backward()时出现了下面这条报错信息:

RuntimeError: grad can be implicitly created only for scalar outputs

原因分析

在定义损失函数loss时,我们设置了参数reduction='none',这导致我们计算出的loss是一个二维的张量,行数为batchsize的大小。

backward只有对标量输出时才会计算梯度,而无法对张量计算梯度。

解决办法

将张量转变成一个标量,比如我们可以对loss求和,然后用求和得到的标量再反向传播求各个参数的梯度,这样不会对结果造成影响。

1.loss.backward