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.注意这里只进行计算部进行追踪