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.注意這裏只進行計算部進行追蹤