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