PyTorch常見的12坑

2021-02-20 機器學習AI算法工程


向AI轉型的程式設計師都關注了這個號👇👇👇

機器學習AI算法工程   公眾號:datayx

1. nn.Module.cuda() 和 Tensor.cuda() 的作用效果差異

無論是對於模型還是數據,cuda()函數都能實現從CPU到GPU的內存遷移,但是他們的作用效果有所不同。

對於nn.Module:

上面兩句能夠達到一樣的效果,即對model自身進行的內存遷移。

對於Tensor:

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

例子:

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數字。所以改為:

如果在累加損失時未將其轉換為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 返回的是標量:

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

長按圖片,識別二維碼

相關焦點

  • 【Pytorch】pytorch常見的坑匯總
    不久,陸陸續續踩了不少坑,記錄一下,個人感覺應該都是一些很容易遇到的一些坑,也在此比較感謝幫我排坑的小夥伴,持續更新,也祝願自己遇到的坑越來越少。然後tf1.2版本剛出來以後,我就立馬升級並且開始tf.data.dataset踩坑,踩了大概2周多的坑,(這個新版的API其實功能並不是非常強大,有不少局限性,在此就不展開)。
  • pytorch常見的坑匯總
    不久,陸陸續續踩了不少坑,記錄一下,個人感覺應該都是一些很容易遇到的一些坑,也在此比較感謝幫我排坑的小夥伴,持續更新,也祝願自己遇到的坑越來越少。然後tf1.2版本剛出來以後,我就立馬升級並且開始tf.data.dataset踩坑,踩了大概2周多的坑,(這個新版的API其實功能並不是非常強大,有不少局限性,在此就不展開)。
  • 【Pytorch】pytorch權重初始化方式與原理
    來自 | 知乎地址 | https://zhuanlan.zhihu.com/p/100937718作者 | 機器學習入坑者
  • 【Pytorch】新手如何入門pytorch?
    第五步 閱讀原始碼 fork pytorch,pytorch-vision等。相比其他框架,pytorch代碼量不大,而且抽象層次沒有那麼多,很容易讀懂的。通過閱讀代碼可以了解函數和類的機制,此外它的很多函數,模型,模塊的實現方法都如教科書般經典。
  • PyTorch的C++ extension寫法
    點擊上方「CVer」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達作者:Monstarrrrhttps://zhuanlan.zhihu.com/p/100459760本文已由作者授權,未經允許,不得二次轉載2019年的最後一天了,終於填了一個早就想了解的坑。
  • Pytorch深度學習從入門到成仙系列二
    安裝 Anaconda 完畢後,我們在安裝 PyTorch 之前最好先創建一個 pytorch 的虛擬環境。之所以創建虛擬環境是因為 Python 為不同的項目需求創建不同的虛擬環境非常常見。
  • 經驗 | PyTorch 開發部署時 5 個常見錯誤
    在這裡,我想分享在生產中使用PyTorch最常見的5個錯誤。考慮過使用CPU嗎?使用多線程?使用更多的GPU內存?這些坑我們都踩過。錯誤 #1 — 在推理模式下保存動態圖如果你以前使用過TensorFlow,那麼你可能知道TensorFlow和PyTorch之間的關鍵區別 —— 靜態圖和動態圖。
  • 小白學PyTorch | 10 pytorch常見運算詳解
    在後續的內容中,有用PyTorch來獲取EfficientNet預訓練模型以及一個貓狗分類的實戰任務教學,EfficientNet是13課,貓狗分類是14課,11課是MobileNet詳解和PyTorch代碼解析,12課是SENet詳解和PyTorch代碼解析(因為EfficientNet是基於這兩個網絡構成的)。
  • pytorch專題前言 | 為什麼要學習pytorch?
    2.為什麼要學習pytorch呢?3.學習了pytorch我怎麼應用呢?4.按照什麼順序去學習pytorch呢?5.網上那麼多資料如何選擇呢?現在開始逐一的對以上問題提出自己的看法,可能想的不夠周全,歡迎討論區一起探討!1.生物學科的朋友需要學編程麼?需要!
  • 【小白學PyTorch】18.TF2構建自定義模型
    小白學PyTorch | 14 tensorboardX可視化教程小白學PyTorch | 13 EfficientNet詳解及PyTorch實現小白學PyTorch |12 SENet詳解及PyTorch實現小白學PyTorch | 11 MobileNet詳解及PyTorch實現小白學PyTorch | 10 pytorch常見運算詳解小白學PyTorch | 9 tensor
  • 在Linux系統中安裝深度學習框架Pytorch
    為pytorch創建一個虛擬環境,這是推薦的做法,這樣在創建其他環境如tensorflow時,就不會互相衝突。在終端輸入:conda create -n pytorch python=3.7 再輸入 conda activate pytorch進入該環境,此外conda deactivate退出該環境。進入該環境後,命令行前面有(pytorch)。
  • 深度學習框架搭建之PyTorch
    如果學習過 NumPy 以及常見的深度學習概念(如卷積層,循環層等),非常容易上手PyTorch。目前主流的深度學習框架主要有 TensorFlow,PyTorch,mxnet,caffe和Keras 等。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    與Keras一樣,它也抽象出了深層網絡編程的許多混亂部分(大神踩過的坑,我們就沒有必要踩了)。就學習難易和語言高級程度而言,Pytorch介於Keras和TensorFlow之間。但比起Keras具有更大的靈活性和控制能力,但又不必進行任何複雜的聲明式編程,如果想深入了解機器學習pytorch庫就是不錯的選擇。
  • 《PyTorch中文手冊》來了
    PyTorch 現在是 GitHub 上增長速度第二快的開源項目,在過去的 12 個月裡,貢獻者增加了 2.8 倍。而且,去年 12 月在 NeurIPS 大會上,PyTorch 1.0 穩定版終於發布。
  • 小白學PyTorch | 12 SENet詳解及PyTorch實現
    小白學PyTorch | 11 MobileNet詳解及PyTorch實現小白學PyTorch | 10 pytorch常見運算詳解小白學PyTorch | 9 tensor數據結構與存儲結構小白學PyTorch | 8 實戰之MNIST小試牛刀小白學PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解
  • Github 2.2K星的超全PyTorch資源列表
    項目地址:https://github.com/facebookresearch/MUSE12.nmtpytorch:PyTorch 神經機器翻譯框架。項目地址:https://github.com/lium-lst/nmtpytorch13.pytorch-wavenet:快速語音生成 WaveNet 的實現。
  • 專欄 | pytorch入門總結指南(1)
    https://github.com/bharathgs/Awesome-pytorch-list總結內容包括了,github上的各類高星tutorial(其實內容上基本差不多大同小異的),pytorch中文手冊,《deep learning with pytorch》《深度學習框架pytorch快速開發與實戰》,《深度學習入門之torch》以及官方文檔,說老實話
  • Pytorch有什麼節省顯存的小技巧?
    3.可見如下issuehttps://discuss.pytorch.org/t/tensor-to-variable-and-memory-freeing-best-practices/6000/24. 使用float16精度混合計算。
  • 用 PyTorch 實現一個簡單的分類器
    所以我總結了一下自己當初學習的路線,準備繼續深入鞏固自己的 pytorch 基礎;另一方面,也想從頭整理一個教程,從沒有接觸過 pytorch 開始,到完成一些最新論文裡面的工作。以自己的學習筆記整理為主線,大家可以針對參考。第一篇筆記,我們先完成一個簡單的分類器。
  • 李飛飛高徒Andrej Karpathy提醒你,小心搭建神經網絡的六個坑
    昨晚,他連發幾條twitter,細數了六種神經網絡研究中的常見錯誤。引發了一波研究者們對於自己入過坑的吐槽。來看一下Ian Goodfellow讓你當心的這六個坑吧:最常見的神經網絡錯誤:>沒有先試過所有數據一批處理忘了為網絡切換訓練/評估模式忘了在.backward()之前.zero_grad()(在pytorch中)將softmaxed輸出傳遞給預期原始logits的損失