從tensorflow轉過來學習Pytorch,對比一下二者的不同:
爲什麼要轉Pytorch?
- 更加靈活(使用tensorflow能夠找到很多別人的代碼,使用Pytorch更加容易實現自己的想法),支持Python化(也就是說基本可以當numpy使用)
- 速度更快
- 代碼簡潔容易上手(0.4版本後沒有
Variable
之類的定義,只有一個tensor的定義,參數requires_grad=True
可以自動求微分,替代Variable)
細節上一些發現
-
以下劃線結束的函數是inplace操作,會修改自身的值。
tensorA.add_(tensorB) # 會改變tensorA的值
-
tensor和numpy很方便互轉且內存共享。
numpyA = tensorA.numpy() # Tensor -> Numpy tensorA = torch.from_numpy(numpyA) # Numpy -> Tensor
-
只有一個元素的tensor 可以調用
tensor.item()
直接取元素值。 -
tensor.backward()
反向傳播之後,tensor.grad
梯度值是累加的,在使用反向傳播之前使用zero_grad()
把梯度清0。 -
view()
有兩個作用,一是改變tensor的shape,二是讓新tensor和原tensor共享內存,相當於深拷貝detach()
,而普通的=
賦值方法不會共享內存。 -
resize()
是另一種可用來調整size的方法,但與view()
不同,如果新維度超過了原維度,會自動分配新的內存空間。 -
增刪維度,
None
類似於np.newaxis()
tensor.unsqueeze(n) # 在第n個維度上增加1個維度 tensor.squeeze(n) # 在第n個維度上壓縮 tensor.squeeze(1) # 壓縮所有維數爲1的維度
-
contiguous()
爲tensor分配整塊的內存,有些tensor並不是佔用一整塊內存,而是由不同的數據塊組成,而tensor的view()操作依賴於內存是整塊的。 -
gather()
??? ??? -
非葉子節點的梯度計算完之後即被清空,可以使用
autograd.grad
或hook
方法獲取非葉子節點的值
常用的庫
- 神經網絡
torch.nn
nn.Module
nn.functional
nn.Sequential