梯度定义: 数学(高数):标量场的梯度是一个向量场。意义:沿着梯度方向,函数变化最快,最大变化率是梯度的大小。(高数的学习)某一点梯度:在该点对各变量求梯度。 反映到tensor上直观的来讲就是:对Tensor通过某个运算得到的标量结果求梯度的结果是一个同型的tensor
注意事项: 1.dtype必须是浮点数 2.一般只能对标量场求梯度。即只能对某一个值求梯度,而不能对一个数组(即向量的坐标表示)求梯度。 否则会报错:grad can be implicitly created only for scalar outputs 如果相对向量场求梯度可以构造一个函数L=sum(x[i]*a[i]) 实操: x.grad(a[]) 传入一个与x同型的张量
具体操作流程: 1.将tensor包装成variablel类型,包装之后tensor可以装载梯度信息。 方式一 设置.requires_grad = True之后,在其上进行的各种操作就会被记录下来,用于后续的梯度计算,其内部实现机制被成为动态计算图(dynamic computation graph)。
import torch
x=torch.tensor([2,2],requires_grad=True,dtype=torch.float64)
print(x)
输出:
tensor([2., 2.], dtype=torch.float64, requires_grad=True)
方式二:用Variable包装
import torch
x=torch.autograd.Variable(torch.tensor([2,2],dtype=torch.float64),requires_grad=True)
tensor([2., 2.], dtype=torch.float64, requires_grad=True)
输出:
2.图的叶子节点是实现创建好的变量,根节点是运算得到的结果变量(注意不要和通常所说的图中的叶子结点,根节点混淆)。根节点的requires_grad属性去决于叶节点,并随之改变。 当在根节点调用.backward()的时候就会从根到叶应用链式法则计算梯度。默认情况下,只有.requires_grad和is_leaf两个属性都为True的节点才会被计算导数,并存储到grad中。 3.反向传播: BP算法 4.backward函数是反向传播的入口点,在需要被求导的节点上调用backward函数会计算梯度值到相应的节点上
参考文章:https://www.cnblogs.com/cocode/p/10746347.html
|