1. 程式人生 > >pytorch文件筆記2-自動微分

pytorch文件筆記2-自動微分


 

import torch

"""

自動微分:

   @ autograd軟體包是PyTorch中所有神經網路的核心,提供了張量上的所有操作的自動微分,也就是反向傳播是根據我們定義的結構來自動完成的。

 

   @ torch.Tensor是程式包的中心類。如果將其屬性.requires_grad設定為True,它將開始跟蹤對其的所有操作。

    完成計算後,您可以呼叫.backward()並自動計算所有梯度並且張量的梯度將新增到.grad屬性中。

 

   @ 要停止張量跟蹤歷史記錄,可以呼叫.detach()將其從計算曆史記錄中分離出來,並防止跟蹤將來的計算。

 

   @ 為了防止跟蹤歷史記錄(和使用記憶體),您還可以將程式碼塊包裝在中。這在評估模型時特別有用,因為模型可能具有的可訓練引數 ,

        但我們不需要梯度。with torch.no_grad():requires_grad=True

 

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