autogrand

神经网络(NN)是在某些输入数据上执行的嵌套函数的集合。 这些函数由参数(由权重和偏差组成)定义,这些参数在 PyTorch 中存储在张量中。

训练 NN 分为两个步骤:

正向传播:在正向传播中,NN 对正确的输出进行最佳猜测。 它通过其每个函数运行输入数据以进行猜测。

反向传播:在反向传播中,NN 根据其猜测中的误差调整其参数。 它通过从输出向后遍历,收集有关函数参数(梯度)的误差导数并使用梯度下降来优化参数来实现。 有关反向传播的更详细的演练,请查看 3Blue1Brown 的视频。

1
import torch,torchvision
1
2
3
4
#* 一个随机张量具有3个通道的64X64的图片
model = torchvision.models.resnet18(pretrained=True)
data = torch.rand(1, 3, 64, 64)
labels =torch.rand(1, 1000)

1.通过模型的每一层运行输入数据,进行正向传播

1
prediction=model(data) #forward pass 

2.计算损失并通过反向传播估计每个模型参数的梯度

1
2
loss=(prediction-labels).sum()
loss.backward() # backward pass

#3.使用SGD优化器根据模型参数的梯度来调整每个模型参数

1.学习率为0.01,
2.动量为0.9
1
2
3
optim=torch.optim.SGD(model.parameters(),lr=1e-2,momentum=0.9)
#! 启用梯度下降,通过grad中的梯度调整参数
optim.step() #gradient descent

Autograd 的微分

让我们来看看autograd如何收集梯度。 我们用requires_grad=True创建两个张量a和b。 这向autograd发出信号,应跟踪对它们的所有操作。

1
2
3
4
5
6
from IPython.display import Latex
a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
#! 误差张量Q
Q=3*a**3-b**2
Latex(r"$Q=3*a^3-b^2$")

$$\begin{equation}
Q=3*a^3-b^2
\end{equation}$$

1
2
3
4
5
6
7
#!分别相对于模型参数进行求偏导
Latex(r'''
$ \frac{\partial Q}{\partial a}=9*a^2$
$ \frac{\partial Q}{\partial b}=-2*b^1$
''')


$$\begin{equation}
\frac{\partial Q}{\partial a}=9*a^2
\end{equation}$$

$$\begin{equation} \frac{\partial Q}{\partial b}=-2*b
\end{equation}$$

当对误差Q进行backward时,可以将Q聚合为一个标量,之后隐式向后调用

Q.sum().backward()
当进行反向传播是,各个参数的梯度分别沉积在a.gradb.grad

1
2
3
4
5
external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)
#* check if collected gradients are correct
print(9*a**2 ==a.grad)
print(-2*b**1 ==b.grad)
tensor([True, True])
tensor([True, True])
------ 本文结束 thankyou 感谢阅读 ------

欢迎扫一扫上面的微信二维码,订阅 codeHub 公众号