向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