PyTorch 模型訓練實用教程(附代碼)

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


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

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


PyTorch 能在短時間內被眾多研究人員和工程師接受並推崇是因為其有著諸多優點,如採用 Python 語言、動態圖機制、網絡構建靈活以及擁有強大的社群等。

本教程以實際應用、工程開發為目的,著重介紹模型訓練過程中遇到的實際問題和方法。如上圖所示,在機器學習模型開發中,主要涉及三大部分,分別是數據、模型和損失函數及優化器。本文也按順序的依次介紹數據、模型和損失函數及優化器,從而給大家帶來清晰的機器學習結構。

通過本教程,希望能夠給大家帶來一個清晰的模型訓練結構。當模型訓練遇到問題時,需要通過可視化工具對數據、模型、損失等內容進行觀察,分析並定位問題出在數據部分?模型部分?還是優化器?只有這樣不斷的通過可視化診斷你的模型,不斷的對症下藥,才能訓練出一個較滿意的模型。

前幾年一直在用 Caffe 和 MatConvNet,近期轉 PyTorch。當時只想快速地用上 PyTorch 進行模型開發,然而搜了一圈 PyTorch 的教程,並沒有找到一款適合的。很多 PyTorch 教程是從學習機器學習 (深度學習) 的角度出發,以 PyTorch 為工具進行編寫,裡面介紹很多模型,並且附上模型的 demo。

然而,工程應用開發中所遇到的問題並不是跑一個模型的 demo 就可以的,模型開發需要對數據的預處理、數據增強、模型定義、權值初始化、模型 Finetune、學習率調整策略、損失函數選取、優化器選取、可視化等等。鑑於此,我只能自己對著官方文檔,一步一步地學習。

起初,只是做了一些學習筆記,後來覺得這些內容應該對大家有些許幫助,畢竟在網際網路上很難找到這類內容的分享,於是此教程就誕生了。

PyTorch 模型訓練實用教程(附代碼)

關注微信公眾號 datayx  然後回復  訓練  即可獲取。

AI項目體驗地址 https://loveai.tech

本教程內容及結構

本教程內容主要為在 PyTorch 中訓練一個模型所可能涉及到的方法及函數,並且對 PyTorch 提供的數據增強方法(22 個)、權值初始化方法(10 個)、損失函數(17 個)、優化器(6 個)及 tensorboardX 的方法(13 個)進行了詳細介紹。

本教程分為四章,結構與機器學習三大部分一致:

第一章,介紹數據的劃分,預處理,數據增強;

第二章,介紹模型的定義,權值初始化,模型 Finetune;

第三章,介紹各種損失函數及優化器;

第四章,介紹可視化工具,用於監控數據、模型權及損失函數的變化。

本教程適用讀者:

想熟悉 PyTorch 使用的朋友;

想採用 PyTorch 進行模型訓練的朋友;

正採用 PyTorch,但無有效機制去診斷模型的朋友;

乾貨直達:

1.6 transforms 的二十二個方法

2.2 權值初始化的十種方法

3.1 PyTorch 的十七個損失函數

3.3 PyTorch 的十個優化器

3.4 PyTorch 的六個學習率調整方法

4.1 TensorBoardX

為了展示該教程的內容,讀者可試讀第二章的第一小節,了解PyTorch如何搭建模型:

第二章 模型

第二章介紹關於網絡模型的一系列內容,包括模型的定義,模型參數初始化方法,模型的保存和加載,模型的 finetune(本質上還是模型權值初始化),首先介紹模型的定義。

2.1 模型的搭建

2.1.1 模型定義的三要

首先,必須繼承 nn.Module 這個類,要讓 PyTorch 知道這個類是一個 Module。

其次,在__init__(self) 中設置好需要的「組件"(如 conv、pooling、Linear、BatchNorm 等)。

最後,在 forward(self, x) 中用定義好的「組件」進行組裝,就像搭積木,把網絡結構搭建出來,這樣一個模型就定義好了。

接下來,請看代碼,在/Code/main_training/main.py 中可以看到定義了一個類 class Net(nn.Module),先看__init__(self) 函數:

第一行是初始化,往後定義了一系列組件,如由 Conv2d 構成的 conv1,有 MaxPool2d 構成的 poo1l,這些操作均由 torch.nn 提供,torch.nn 中的操作可查看文檔:https://PyTorch.org/docs/stable/nn.html#。

當這些組件定義好之後,就可以定義 forward() 函數,用來搭建網絡結構,請看代碼:

x 為模型的輸入,第一行表示,x 經過 conv1,然後經過激活函數 relu,再經過 pool1 操作;

第二行於第一行一樣;第三行,表示將 x 進行 reshape,為了後面做為全連接層的輸入;

第四,第五行的操作都一樣,先經過全連接層 fc,然後經過 relu;

第六行,模型的最終輸出是 fc3 輸出。

至此,一個模型定義完畢,接著就可以在後面進行使用。例如,實例化一個模型 net = Net(),然後把輸入 inputs 扔進去,outputs = net(inputs),就可以得到輸出 outputs。

2.1.2 模型定義多說兩句

上面只是介紹了模型定義的要素和過程,但是在工程應用中會碰到各種各樣的網絡模型,這時,我們就需要一些實用工具來幫助我們定義模型了。

這裡以 Resnet34 為例介紹「複雜」模型的定義,這部分代碼從 github 上獲取。

還是從三要素出發看看是怎麼定義 Resnet34 的。

首先,繼承 nn.Module;

其次,看__init__() 函數,在__init__() 中,定義了這些組件,self.pre,self.layer1-4, self.fc ;

最後,看 forward(),分別用了在__init__() 中定義的一系列組件,並且用了 torch.nn.functional.avg_pool2d 這個操作。

至此,網絡定義完成。

以為就完了?怎麼可能,__init__() 函數中的組件是怎麼定義的,在__init__() 中出現了 torch.nn.Sequential。

組件定義還調用函數_make_layer(),其中也用到了 torch.nn.Sequential,其中還調用了 ResidualBlock(nn.Module),在 ResidualBlock(nn.Module) 中有一次調用了 torch.nn.Sequential。

torch.nn.Sequential 到底是什麼呢?為什麼都在用呢?

2.1.3 nn.Sequetial

torch.nn.Sequential 其實就是 Sequential 容器,該容器將一系列操作按先後順序給包起來,方便重複使用。例如 Resnet 中有很多重複的 block,就可以用 Sequential 容器把重複的地方包起來。

官方文檔中給出兩個使用例子:

模型的定義就是先繼承,再構建組件,最後組裝。其中基本組件可從 torch.nn 中獲取,或者從 torch.nn.functional 中獲取,同時為了方便重複使用組件,可以使用 Sequential 容器將一系列組件包起來,最後在 forward() 函數中將這些組件組裝成你的模型。

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

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

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

《深度學習入門:基於Python的理論與實現》高清中文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  

QQ群 

333972581

相關焦點

  • 快速上手筆記,PyTorch模型訓練實用教程(附代碼)
    本教程以實際應用、工程開發為目的,著重介紹模型訓練過程中遇到的實際問題和方法。如上圖所示,在機器學習模型開發中,主要涉及三大部分,分別是數據、模型和損失函數及優化器。本文也按順序的依次介紹數據、模型和損失函數及優化器,從而給大家帶來清晰的機器學習結構。通過本教程,希望能夠給大家帶來一個清晰的模型訓練結構。
  • 84 頁中文版的 PyTorch 模型訓練實用教程發布!
    本教程以實際應用、工程開發為目的,著重介紹模型訓練過程中遇到的實際問題和方法。如上圖所示,在機器學習模型開發中,主要涉及三大部分,分別是數據、模型和損失函數及優化器。本文也按順序的依次介紹數據、模型和損失函數及優化器,從而給大家帶來清晰的機器學習結構。通過本教程,希望能夠給大家帶來一個清晰的模型訓練結構。
  • TensorRT加速PyTorch模型教程
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。
  • 84 頁的 PyTorch 模型訓練實用教程中文版發布!
    在機器學習模型開發中,主要涉及三大部分,分別是數據、模型和損失函數及優化器。本文也按順序的依次介紹數據、模型和損失函數及優化器,從而給大家帶來清晰的機器學習結構。通過本教程,希望能夠給大家帶來一個清晰的模型訓練結構。
  • 使用Pytorch訓練分類器詳解(附python演練)
    這提供了極大的便利,並且避免了編寫「樣板代碼」。 對於本教程,我們將使用CIFAR10數據集,它包含十個類別:『airplane』, 『automobile』, 『bird』, 『cat』, 『deer』, 『dog』, 『frog』, 『horse』, 『ship』, 『truck』。
  • PyTorch 分布式訓練簡明教程
    神經網絡訓練加速的最簡單方法是使用GPU,對弈神經網絡中常規操作(矩陣乘法和加法)GPU運算速度要倍超於CPU。隨著模型或數據集越來越大,一個GPU很快就會變得不足。例如,BERT和GPT-2等大型語言模型是在數百個GPU上訓練的。
  • PyTorch分布式訓練簡明教程
    AI編輯:我是小將神經網絡訓練加速的最簡單方法是使用GPU,對弈神經網絡中常規操作(矩陣乘法和加法)GPU運算速度要倍超於CPU。隨著模型或數據集越來越大,一個GPU很快就會變得不足。例如,BERT和GPT-2等大型語言模型是在數百個GPU上訓練的。
  • pytorch多gpu並行訓練
    .使用共享文件系統初始化2.1.3.初始化rank和world_size2.1.4.初始化中一些需要注意的地方2.2.數據的處理-DataLoader2.3.模型的處理2.4.模型的保存與加載pytorch多gpu並行訓練注: 以下都在Ubuntu上面進行的調試, 使用的Ubuntu
  • Pytorch多GPU訓練
    我看一個github上面的人說在單機8顯卡可以滿足的情況下, 最好不要進行多機多卡訓練。建議看這兩份代碼, 實際運行一下, 才會真的理解怎麼使用。, 也就是world_size2.1.1.初始化backend首先要初始化的是backend, 也就是俗稱的後端, 在pytorch的官方教程中提供了以下這些後端根據官網的介紹, 如果是使用cpu的分布式計算, 建議使用gloo, 因為表中可以看到 gloo對cpu的支持是最好的, 然後如果使用gpu進行分布式計算, 建議使用nccl, 實際測試中我也感覺到, 當使用gpu的時候, nccl
  • Python 文本分析(3)Pytorch-transformer實際應用
    一個叫Hugging face的天才創業團隊下凡普渡眾生了,在他們的網站上給出了六種NLP模型,均為現在自然語言處理(NLP)領域最常用的六種模型:BERT,GPT,GPT-2,Transformer-XL,XLNet,XLMGithub地址:https://github.com/huggingface/pytorch-transformers教程文檔:
  • 輕鬆學 Pytorch:行人檢測 Mask-RCNN 模型訓練與使用
    大家好,這個是輕鬆學Pytorch的第20篇的文章分享,主要是給大家分享一下,如何使用數據集基於Mask-RCNN訓練一個行人檢測與實例分割網絡。這個例子是來自Pytorch官方的教程,我這裡是根據我自己的實踐重新整理跟解讀了一下,分享給大家。前面一篇已經詳細分享了關於模型本身,格式化輸入與輸出的結果。
  • pytorch如何將訓練提速?
    訓練模型個人的基本要求是deterministic/reproducible,或者說是可重複性。也就是說在隨機種子固定的情況下,每次訓練出來的模型要一樣。之前遇到了兩次不可重複的情況。第一次是訓練CNN的時候,發現每次跑出來小數點後幾位會有不一樣。epoch越多,誤差就越多,雖然結果大致上一樣,但是強迫症真的不能忍。
  • PyTorch模型訓練特徵圖可視化(TensorboardX)
    本文所有代碼解讀均基於PyTorch 1.0,Python3;本文為原創文章,初次完成於2019.03,最後更新於2019.09;最近復現的一篇論文一直都難以work,上了特徵圖可視化後一下子就找到了問題所在,所以今天想梳理一下PyTorch裡面的特徵圖可視化。
  • 一文理解PyTorch:附代碼實例
    PyTorch也非常具有Python風格,注重簡潔和實用。此外,也有一些使用者說,使用PyTorch甚至可以改善健康。網上有許多PyTorch教程,它的文檔非常完整和廣泛。那麼,為什麼要繼續閱讀這個循序漸進的教程呢?這份教程以一系列常見的例子為主從基本原理開始講解。從而使大家對PyTorch的理解更加直觀。本文除了這些之外,還將提供一些避免常見陷阱和錯誤的建議。
  • Pytorch量化感知訓練詳解
    在這個過程中,所有計算(包括模型正反向傳播計算和偽量化節點計算)都是以浮點計算實現的,在訓練完成後才量化為真正的int8模型。    Pytorch官方從1.3版本開始提供量化感知訓練API,只需修改少量代碼即可實現量化感知訓練。目前torch.quantization仍處於beta階段,不保證API前向、後向兼容性。
  • 【他山之石】PyTorch使用預訓練模型進行模型加載
    為此,我們特別搜集整理了一些實用的代碼連結,數據集,軟體,編程技巧等,開闢「他山之石」專欄,助你乘風破浪,一路奮勇向前,敬請關注。地址:https://www.zhihu.com/people/panda-9-6通過模型以及模型參數的保存,實現模型的加載,我之前已經在一篇文章寫過了,在最近的學習任務中,以及和知友的討論中,遇到了這樣一種情況,如果網絡模型發生改動,那麼使用預訓練模型進行加載的情況下,網絡模型是如何加載的,對此進行了一些簡單的實驗。來驗證自己的一些想法。
  • GPT2模型訓練,50w個多輪中文對話語料
    ,使用 HuggingFace的transformers實現GPT2模型的編寫與訓練。在閒暇時間用 GPT2-Chinese模型訓練了幾個長文本的生成模型,並且精讀了一遍作者的源碼,獲益匪淺,加深了自己對GPT2生成模型的一些理解,於是將GPT2模型用於閒聊對話的生成,非常感謝作者的分享。本項目中沿用了原項目中的部分結構和一些命名方式,同時也對很多代碼細節做出了自己實現。
  • TensorRT 加速 PyTorch 模型基本方法
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。
  • 用PyTorch部署模型
    >為了展示torchserve,我們將提供一個經過全面訓練的ResNet34進行圖像分類的服務。子類化BaseHandler 的主要優點是可以在self.model上訪問加載的模型。下面的代碼片段展示了如何子類化BaseHandler。子類化BaseHandler以創建自己的handler回到圖像分類的例子。
  • 如何使用TensorRT對訓練好的PyTorch模型進行加速?
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。