Pytorch 快速入門 :從tensorflow轉Pytorch的筆記(gather的用法,待補充...)

從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.gradhook方法獲取非葉子節點的值

常用的庫

  1. 神經網絡
torch.nn
nn.Module
nn.functional 

nn.Sequential
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章