PyTorch Handbook

224课时
3.1K学过
8分

10. CNN:MNIST数据集手写数字识别

11. RNN实例:通过Sin预测Cos

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
10分钟

损失函数

一个损失函数接受一对 (output, target) 作为输入,计算一个值来估计网络的输出和目标值相差多少。

译者注:output为网络的输出,target为实际值

nn包中有很多不同的损失函数nn.MSELoss是一个比较简单的损失函数,它计算输出和目标间的均方误差, 例如:

In [8]:

output = net(input)
target = torch.randn(10)  # 随机值作为样例
target = target.view(1, -1)  # 使target和output的shape相同
criterion = nn.MSELoss()

loss = criterion(output, target)
print(loss)

tensor(0.8109, grad_fn=<MseLossBackward>)

现在,如果在反向过程中跟随loss , 使用它的 .grad_fn 属性,将看到如下所示的计算图。

::

input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d -> view -> linear -> relu -> linear -> relu -> linear -> MSELoss -> loss

所以,当我们调用 loss.backward()时,整张计算图都会 根据loss进行微分,而且图中所有设置为requires_grad=True的张量 将会拥有一个随着梯度累积的.grad 张量。

为了说明,让我们向后退几步:

In [9]:

print(loss.grad_fn)  # MSELoss
print(loss.grad_fn.next_functions[0][0])  # Linear
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU

<MseLossBackward object at 0x7f3b49fe2470> <AddmmBackward object at 0x7f3bb05f17f0> <AccumulateGrad object at 0x7f3b4a3c34e0>