PyTorch常見的12坑


向AI轉型的程序員都關注了這個號👇👇👇python

機器學習AI算法工程   公衆號:datayxgit


1. nn.Module.cuda() 和 Tensor.cuda() 的做用效果差別

不管是對於模型仍是數據,cuda()函數都能實現從CPU到GPU的內存遷移,可是他們的做用效果有所不一樣。程序員

對於nn.Module:github



上面兩句可以達到同樣的效果,即對model自身進行的內存遷移。web

對於Tensor:面試

和nn.Module不一樣,調用tensor.cuda()只是返回這個tensor對象在GPU內存上的拷貝,而不會對自身進行改變。所以必須對tensor進行從新賦值,即tensor=tensor.cuda().算法

例子:docker


2. PyTorch 0.4 計算累積損失的不一樣

以普遍使用的模式total_loss += loss.data[0]爲例。Python0.4.0以前,loss是一個封裝了(1,)張量的Variable,但Python0.4.0的loss如今是一個零維的標量。對標量進行索引是沒有意義的(彷佛會報 invalid index to scalar variable 的錯誤)。使用loss.item()能夠從標量中獲取Python數字。因此改成:flask


若是在累加損失時未將其轉換爲Python數字,則可能出現程序內存使用量增長的狀況。這是由於上面表達式的右側本來是一個Python浮點數,而它如今是一個零維張量。所以,總損失累加了張量和它們的梯度歷史,這可能會產生很大的autograd 圖,耗費內存和計算資源。安全

 

3. PyTorch 0.4 編寫不限制設備的代碼



4. torch.Tensor.detach()的使用

detach()的官方說明以下:



假設有模型A和模型B,咱們須要將A的輸出做爲B的輸入,但訓練時咱們只訓練模型B. 那麼能夠這樣作:

input_B = output_A.detach()

它可使兩個計算圖的梯度傳遞斷開,從而實現咱們所需的功能。

 

5. ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm)

出現這個錯誤的狀況是,在服務器上的docker中運行訓練代碼時,batch size設置得過大,shared memory不夠(由於docker限制了shm).解決方法是,將Dataloader的num_workers設置爲0.

 

6. pytorch中loss函數的參數設置

以CrossEntropyLoss爲例:

  • 若 reduce = False,那麼 size_average 參數失效,直接返回向量形式的 loss,即batch中每一個元素對應的loss.

  • 若 reduce = True,那麼 loss 返回的是標量:

    • 若是 size_average = True,返回 loss.mean().

    • 若是 size_average = False,返回 loss.sum().

  • weight : 輸入一個1D的權值向量,爲各個類別的loss加權,以下公式所示:


  • ignore_index : 選擇要忽視的目標值,使其對輸入梯度不做貢獻。若是 size_average = True,那麼只計算不被忽視的目標的loss的均值。

  • reduction : 可選的參數有:‘none’ | ‘elementwise_mean’ | ‘sum’, 正如參數的字面意思,不解釋。

7. pytorch的可重複性問題

參考這篇博文:https://blog.csdn.net/hyk_1996/article/details/84307108

 

8. 多GPU的處理機制

使用多GPU時,應該記住pytorch的處理邏輯是:

1.在各個GPU上初始化模型。

2.前向傳播時,把batch分配到各個GPU上進行計算。

3.獲得的輸出在主GPU上進行彙總,計算loss並反向傳播,更新主GPU上的權值。

4.把主GPU上的模型複製到其它GPU上。

 

9. num_batches_tracked參數

今天讀取模型參數時出現了錯誤


大概能夠看出,這個參數和訓練時的歸一化的計算方式有關。

所以,咱們能夠知道該錯誤是因爲訓練和測試所用的pytorch版本(0.4.1版本先後的差別)不一致引發的。具體的解決方案是:若是是模型參數(Orderdict格式,很容易修改)裏少了num_batches_tracked變量,就加上去,若是是多了就刪掉。偷懶的作法是將load_state_dict的strict參數置爲False,以下所示:



還看到有人直接修改pytorch 0.4.1的源代碼把num_batches_tracked參數刪掉的,這就很是不建議了。

 

10. 訓練時損失出現nan的問題

最近在訓練模型時出現了損失爲nan的狀況,發現是個大坑。暫時先記錄着。

可能致使梯度出現nan的三個緣由:

1.梯度爆炸。也就是說梯度數值超出範圍變成nan. 一般能夠調小學習率、加BN層或者作梯度裁剪來試試看有沒有解決。

2.損失函數或者網絡設計。比方說,出現了除0,或者出現一些邊界狀況致使函數不可導,比方說log(0)、sqrt(0).

3.髒數據。能夠事先對輸入數據進行判斷看看是否存在nan.

補充一下nan數據的判斷方法:

注意!像nan或者inf這樣的數值不能使用 == 或者 is 來判斷!爲了安全起見統一使用 math.isnan() 或者 numpy.isnan() 吧。

例如:


raise ValueError('Expected more than 1 value per channel when training, got input size {}'.format(size))


沒有什麼特別好的解決辦法,在訓練前用 num_of_samples % batch_size 算一下會不會正好剩下一個樣本。

能夠考慮將`DataLoader`的`drop_last`選項設爲True,這樣的話,當最後一個batch湊不滿時,就會捨棄掉。

 

12. 優化器的weight_decay項致使的隱蔽bug

咱們都知道weight_decay指的是權值衰減,即在原損失的基礎上加上一個L2懲罰項,使得模型趨向於選擇更小的權重參數,起到正則化的效果。可是我常常會忽略掉這一項的存在,從而引起了意想不到的問題。

此次的坑是這樣的,在訓練一個ResNet50的時候,網絡的高層部分layer4暫時沒有用到,所以也並不會有梯度回傳,因而我就放心地將ResNet50的全部參數都傳遞給Optimizer進行更新了,想着layer4應該能保持原來的權重不變纔對。可是實際上,儘管layer4沒有梯度回傳,可是weight_decay的做用仍然存在,它使得layer4權值愈來愈小,趨向於0。後面須要用到layer4的時候,發現輸出異常(接近於0),才注意到這個問題的存在。

雖然這樣的狀況可能不容易遇到,可是仍是要謹慎:暫時不須要更新的權值,必定不要傳遞給Optimizer,避免沒必要要的麻煩。

 

13. 優化TensorDataset的數據加載速度

`TensorDataset`提供了已經徹底加載到內存中的矩陣的數據讀取接口。在使用`TensorDataset`的時候,若是直接用`DataLoader`,會致使數據加載速度很是緩慢,嚴重拖慢訓練速度,分析和解決方案詳見https://huangbiubiu.github.io/2019/BEST-PRACTICE-PyTorch-TensorDataset/


原文地址 https://blog.csdn.net/hyk_1996/article/details/80824747




閱讀過本文的人還看了如下文章:


TensorFlow 2.0深度學習案例實戰


基於40萬表格數據集TableBank,用MaskRCNN作表格檢測


《基於深度學習的天然語言處理》中/英PDF


Deep Learning 中文版第一版-周志華團隊


【全套視頻課】最全的目標檢測算法系列講解,通俗易懂!


《美團機器學習實踐》_美團算法團隊.pdf


《深度學習入門:基於Python的理論與實現》高清中文PDF+源碼


特徵提取與圖像處理(第二版).pdf


python就業班學習視頻,從入門到實戰項目


2019最新《PyTorch天然語言處理》英、中文版PDF+源碼


《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼


《深度學習之pytorch》pdf+附書源碼


PyTorch深度學習快速實戰入門《pytorch-handbook》


【下載】豆瓣評分8.1,《機器學習實戰:基於Scikit-Learn和TensorFlow》


《Python數據分析與挖掘實戰》PDF+完整源碼


汽車行業完整知識圖譜項目實戰視頻(全23課)


李沐大神開源《動手學深度學習》,加州伯克利深度學習(2019春)教材


筆記、代碼清晰易懂!李航《統計學習方法》最新資源全套!


《神經網絡與深度學習》最新2018版中英PDF+源碼


將機器學習模型部署爲REST API


FashionAI服裝屬性標籤圖像識別Top1-5方案分享


重要開源!CNN-RNN-CTC 實現手寫漢字識別


yolo3 檢測出圖像中的不規則漢字


一樣是機器學習算法工程師,你的面試爲何過不了?


前海徵信大數據算法:風險機率預測


【Keras】完整實現‘交通標誌’分類、‘票據’分類兩個項目,讓你掌握深度學習圖像分類


VGG16遷移學習,實現醫學圖像識別分類工程項目


特徵工程(一)


特徵工程(二) :文本數據的展開、過濾和分塊


特徵工程(三):特徵縮放,從詞袋到 TF-IDF


特徵工程(四): 類別特徵


特徵工程(五): PCA 降維


特徵工程(六): 非線性特徵提取和模型堆疊


特徵工程(七):圖像特徵提取和深度學習


如何利用全新的決策樹集成級聯結構gcForest作特徵工程並打分?


Machine Learning Yearning 中文翻譯稿


螞蟻金服2018秋招-算法工程師(共四面)經過


全球AI挑戰-場景分類的比賽源碼(多模型融合)


斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)


python+flask搭建CNN在線識別手寫中文網站


中科院Kaggle全球文本匹配競賽華人第1名團隊-深度學習與特徵工程



不斷更新資源

深度學習、機器學習、數據分析、python

 搜索公衆號添加: datayx  



機大數據技術與機器學習工程

 搜索公衆號添加: datanlp

長按圖片,識別二維碼

本文分享自微信公衆號 - 機器學習AI算法工程(datayx)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索