pytorch自动微分
torch.Tensor是包的核心类,有个属性.requires_grad设为True就会跟踪tensor所有操作。计算完成后调用backward()自动计算所有梯度。这个张量的梯度将累计到.grad属性中
调用.detach()可以与计算历史记录分离。
也可以用 with torch.no_grad(): 包起来。
Tensor当中有一个属性grad_fn用来记录创建了张量的Function引用。
1 | import torch |
out:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
做一次加法操作
1 | import torch |
out
tensor([[3., 3.],
[3., 3.]], grad_fn=
做更多操作
1 | z = y * y * 3 |
out:
tensor([[27., 27.],
[27., 27.]], grad_fn=
激活函数
pytorch中的激活函数所在的位置是 torch.nn.functional当中,使用的时候引入即可
1 | import torch |
加载数据
使用pytorch中的utils.data
1 | import torch.utils.data as Data |
pytorch的使用
个人翻译pytorch官网60min教程
让我们看一下单词训练。 比如, 我们从torchvision中加载一个预训练resnet18模型。我们创建一个随机tensor数据去代表一个有3通道,高和宽都是64的图像,它对应的label初始化为一些随机数。
1 | import os |
接下来,我们将输入数据通过模型的每一层做一次预测,这就是前向传播
1 | prediction = model(data) |
我们用模型的预测和对应的label去计算误差(loss). 下一步是对网络的误差进行反向传播。当我们调用误差tensor的.backward()的时候,反向传播开始。自动梯度接下来会为每个模型参数计算并存储梯度在参数的.grad属性
1 | loss = (prediction - labels).sum() |
下一步,我们加载一个优化器, 在这个例子用的SGD,学习率为0.01,动量为0.9,我们在这个优化器中注册模型的所有参数
1 | optim = torch.optim.SGD(model.parameters(), lr=0.01, momentum= 0.9) |
最终,我们调用.step()去初始化梯度下降。优化器通过存储在.grad中的梯度调整每一个参数
到这一步,你已经掌握了训练你的神经网络所需的所有东西。
这里官网教程往后是详细介绍梯度原理。求梯度原理请见深度学习入门笔记04