pytorch文档笔记2-自动微分


 

import torch网络

"""ui

自动微分:编码

   @ autograd软件包是PyTorch中全部神经网络的核心,提供了张量上的全部操做的自动微分,也就是反向传播是根据咱们定义的结构来自动完成的。orm

 

   @ torch.Tensor是程序包的中心类。若是将其属性.requires_grad设置为True,它将开始跟踪对其的全部操做。内存

    完成计算后,您能够调用.backward()并自动计算全部梯度而且张量的梯度将添加到.grad属性中。it

 

   @ 要中止张量跟踪历史记录,能够调用.detach()将其从计算历史记录中分离出来,并防止跟踪未来的计算。io

 

   @ 为了防止跟踪历史记录(和使用内存),您还能够将代码块包装在中。这在评估模型时特别有用,由于模型可能具备的可训练参数 ,import

        但咱们不须要梯度。with torch.no_grad():requires_grad=Truerequire

 

   @ Tensor并Function相互链接并创建一个无环图,该图对完整的计算历史进行编码。每一个张量都有一个.grad_fn属性,软件

        该属性引用Function已建立的Tensor(用户建立的张量除外)。grad_fn is None

"""

 

#梯度跟踪

#tensor([[1., 1.],  [1., 1.]], requires_grad=True) 注意其输出带有一个requires_grad

x = torch.ones(2,2,requires_grad=True)

print(x)

"""

tensor([[3., 3.],

        [3., 3.]], grad_fn=<AddBackward0>)注意最终在跟踪梯度  注意y此时具备了grad_fn

"""

 

y = x+2

print(y)

print(y.grad_fn)#<AddBackward0 object at 0x000001A7B5481D68>

z = y*y*3

out = z.mean()

"""

tensor([[27., 27.],

        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

"""

 

print(z,out)

a = torch.randn(2,2)

a = ((a*3)/(a-1))

print(a.requires_grad)#False,默认为False

a.requires_grad_(True)#将跟踪标志设置为true;

b = (a*a).sum()

print(b.grad_fn)

 

#梯度:

out.backward()

"""

tensor([[4.5000, 4.5000],

        [4.5000, 4.5000]])

"""

print(x.grad)

"""

注意以上的梯度只是针对单个的tensor,实际使用的时候会是一个雅各布矩阵,因此NN里面的应用是:

"""

x = torch.randn(3, requires_grad=True)#随机产生3个数

 

y = x * 2#注意这里y是一个矩阵,重点是否是单个元素了。此时求梯度不方便了。为了计算梯度,须要传递向量。

while y.data.norm() < 1000:

    y = y * 2

 

print(y)

v =torch.tensor([0.1,1.0,0.0001],dtype=torch.float)

y.backward(v)#进行传递,注意这里不是标量,是一个vector;

 

#有时候咱们不须要grad跟踪信息,能够进行分块去除;

print(x.requires_grad)

print((x**2).requires_grad)

with torch.no_grad():

    print((x**2).requires_grad)#false.注意这里只进行计算部进行追踪

相关文章
相关标签/搜索