在PyTorch中,所有神经网络的核心都是autograd包。autograd包为张量上的所有操作提供了自动微分机制。它是一个按运行定义的框架,这意味着反向传播取决于代码的运行方式,并且每次迭代都可以不同。Tensor张量:n维向量torch.Tensor是这个包的核心类。如果将其属性.requires_grad设置为True,那么它将跟踪张量上的所有操作。所有的梯度都可以在计算完成后调用.backward()自动计算。此张量的所有梯度将自动累积到.grad属性。x=torch.ones(2,2,requires_grad=True#创建一个tensor并设置requires_grad=True来跟踪它的计算历史print(x)为了防止一个tensor被跟踪,可以调用它的.detach()方法与计算历史解耦并防止其未来的计算记录被跟踪。为了防止跟踪历史(和使用内存),代码块可以用torch.no_grad():包装。在评估模型时特别有用,因为模型可能有requires_grad=True的可训练参数,但是我们在这个过程中不需要为它们计算梯度。还有一个类对于autograd的实现非常重要:Function。Tensor和Function是相互联系的生成一个无环图(acyclicgraph),它编码了完整的计算历史,每个tensor都有一个.grad_fn属性,指的是创建Tensor本身的Function(除非tensor是用户手动创建的,即t张量的grad_fn为None)。如果您需要计算导数,您可以在张量上调用.backward()。如果Tensor是一个标量(即它包含一个元素的数据),则不需要为backward()指定任何参数,但如果它有更多的元素,则需要指定一个梯度参数,这是具有匹配形状的张量。y=x+2#对这个张量做运算y是计算的结果,所以它有grad_fn属性。z=y*y*3#对y执行更多操作out=z.mean()#print(z,out).requires_grad_(...)就地更改现有张量的requires_grad标志。如果未指定,则此标志的默认输入为False。a=torch.randn(2,2)a=((a*3)/(a-1))print(a.requires_grad)a.requires_grad_(True)print(a.requires_grad)b=(a*a).sum()print(b.grad_fn)Gradient梯度:方向导数,此时函数沿方向(梯度的方向)变化最快,变化率最大(坡度)。现在开始反向传播,因为out是一个标量,所以out.backward()等同于out.backward(torch.tensor(1.))。out.backward()输出导数d(out)/dxprint(x.grad)得到的是一个所有值为4.5的矩阵。计算步骤:在数学上,如果存在一个向量值函数y=f(x),那么y相对于x的梯度就是一个雅可比矩阵:一般来说,torch.autograd是一个计算雅可比向量的“引擎”产品。根据链式法则,雅可比积:雅可比积的这一特性使得将外部梯度输入具有非标量输出的模型非常方便。现在让我们看一个雅可比向量积的例子:x=torch.randn(3,requires_grad=True)y=x*2whiley.data.norm()<1000:y=y*2print(y)在这种情况下,y不再是标量。torch.autograd不能直接计算完整的雅可比矩阵,但如果我们只想要雅可比向量乘积,只需将这个向量作为参数传递给反向:v=torch.tensor([0.1,1.0,0.0001],dtype=torch.float)y.backward(v)print(x.grad)还可以通过将代码块包装在torch.no_grad():中来防止autograd使用.requires_grad=True跟踪张量的历史。print(x.requires_grad)print((x**2).requires_grad)和torch.no_grad():print((x**2).requires_grad)来源网络,仅供学习,侵删。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。
