在控制流的例子中,如果我们将变量a更改为随机向量或矩阵,会发生什么
如果将a改成一个3行1列的随机数矩阵
程序运行结果如下:
torch.Size([3, 1])
tensor([[0.2728], [1.0503], [0.5629]], requires_grad=True)
tensor(2.4448, grad_fn=<CopyBackwards>)
tensor(4.8897, grad_fn=<CopyBackwards>)
tensor(9.7794, grad_fn=<CopyBackwards>)
tensor(19.5587, grad_fn=<CopyBackwards>)
tensor(39.1175, grad_fn=<CopyBackwards>)
tensor(78.2349, grad_fn=<CopyBackwards>)
tensor(156.4698, grad_fn=<CopyBackwards>)
tensor(312.9396, grad_fn=<CopyBackwards>)
tensor(625.8792, grad_fn=<CopyBackwards>)
C==b
tensor([[ 279.3541], [1075.4806], [ 576.3696]], grad_fn=<MulBackward0>)
RuntimeError: grad can be implicitly created only for scalar outputs
报运行时错误:只有对标量输出它才会计算梯度
但显然这里a是一个矩阵,当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。这里,我们的目的不是计算微分矩阵,而是批量中每个样本单独计算的偏导数之和。
输出结果如下:
torch.Size([3, 1])
tensor([[-3.9814e-04], [ 1.5525e+00], [-8.2370e-01]], requires_grad=True) tensor(3.5150, grad_fn=<CopyBackwards>)
tensor(7.0300, grad_fn=<CopyBackwards>)
tensor(14.0601, grad_fn=<CopyBackwards>)
tensor(28.1202, grad_fn=<CopyBackwards>)
tensor(56.2403, grad_fn=<CopyBackwards>)
tensor(112.4806, grad_fn=<CopyBackwards>)
tensor(224.9612, grad_fn=<CopyBackwards>)
tensor(449.9225, grad_fn=<CopyBackwards>)
tensor(899.8450, grad_fn=<CopyBackwards>)
C==b
tensor([[-4.0770e-01], [ 1.5898e+03], [-8.4347e+02]], grad_fn=<MulBackward0>)
tensor([[1024.], [1024.], [1024.]])
----end----