楚雄市网站建设公司,网站原型是什么,2022年必火的创业项目加盟,可以做来电名片的网站小白学Pytorch系列-- torch.autograd API torch.Autograd提供了实现任意标量值函数的自动微分的类和函数。它只需要对现有代码进行最小的更改-你只需要声明张量s#xff0c;它的梯度应该用requires gradTrue关键字计算。到目前为止#xff0c;我们只支持浮点张量类型(half, f…小白学Pytorch系列-- torch.autograd API torch.Autograd提供了实现任意标量值函数的自动微分的类和函数。它只需要对现有代码进行最小的更改-你只需要声明张量s它的梯度应该用requires gradTrue关键字计算。到目前为止我们只支持浮点张量类型(half, float, double和bfloat 16)和复杂张量类型(cfloat, cdouble)的autograd。
基本概念
VariableParameter和torch.tensor()
torch.nn.Parameter(是Variable的子类) 如果在网络的训练过程中需要更新就要定义为Parameter, 类似为W(权重)和b(偏置)也都是Parameter
Variable默认是不需要求梯度的还需要手动设置参数 requires_gradTrue。Variable因为要多次反向传播那么在backward的时候还要手动注明参数(),就非常麻烦。 Pytorch主要通过引入nn.Parameter类型的变量和optimizer机制来解决了这个问题。Parameter是Variable的子类本质上和后者一样只不过parameter默认是求梯度的同时一个网络中的parameter变量是可以通过 net.parameters() 来很方便地访问到的只需将网络中所有需要训练更新的参数定义为Parameter类型再用以optimizer就能够完成所有参数的更新了例如optimizer torch.optim.SGD(net.parameters(), lr1e-1)
相同点 :torch.tensor()、torch.autograd.Variable和torch.nn.Parameter基本一样。 前两者都可以设置requires_grad参数后者则直接默认requires_gradTrue。 三者都拥有.data,.grad,.grad_fn等属性。 所以只要requires_gradTrue都可以计算梯度以及backward()。
不同之处 torch.nn.Parameter直接默认requires_gradTrue在参数量大时更加方便。
反向传播
参考 https://blog.csdn.net/lj2048/article/details/113527400 实现autograd依赖于Variable和Function这两种数据类型。Variable是Tensor的外包装Varibale和Tensor基本一致区别在于多了下面几个属性。 variable类型变量的data属性存储着Tensor数据grad属性存储关于该变量的导数creator是代表该变量的创造者。 Variable和Function它们是彼此不分开的如下图所示是数据向前传输和向后传输生成导数的过程。 如图假设我们有一个输入变量input数据类型为Variableinput是用户输入的所以其创造者creator为null值input经过第一个数据操作operation1比如加减乘除运算得到output1变量数据类型仍为Variable这个过程中会自动生成一个function1的变量数据类型为Function的一个实例而output1的创造者就是这个function1。随后output1再经过一个数据操作生成output2这个过程也会生成另外一个实例function2output2的创造者creator为function2。
示例可以参考该Blog: 参考PyTorch教程之Autograd
目标张量一般都是标量如我们经常使用的损失值Loss一般都是一个标量。但也有非标量的情况后面将介绍的Deep Dream的目标值就是一个含多个元素的张量。那如何对非标量进行反向传播呢
PyTorch有个简单的规定不让张量Tensor对张量求导只允许标量对张量求导 因此如果目标张量对一个非标量调用backward()则需要传入一个gradient参数该参数也是张量而且需要与调用backward()的张量形状相同。
参考
https://zhuanlan.zhihu.com/p/321449610