PyTorch是一個不斷發(fā)展的深度學習框架,具有許多令人興奮的附加功能。我們將回顧其基本元素,并逐步演示構建簡單的深度神經(jīng)網(wǎng)絡(DNN)的示例。
PyTorch的基礎知識-簡介
自從2017年初推出它以來, PyTorch 已經(jīng)成為高度流行且廣泛使用的深度學習(DL)框架。自從不起眼的開始以來,它就引起了全世界工業(yè)界和學術界的嚴肅AI研究人員和從業(yè)者的注意,并且這些年來已經(jīng)顯著成熟。
數(shù)十名DL發(fā)燒友和專業(yè)人士從百度開始了他們的旅程,但是基于TensorFlow的學習曲線一直很艱難。另一方面,PyTorch從一開始就以一種直觀的方式進行DL編程,以一種易于理解且易于逐步學習的方式專注于基本線性代數(shù)和數(shù)據(jù)流運算。
由于采用了這種模塊化方法,與遵循較為嚴格的TF和基于TF的工具框架相比,使用PyTorch進行復雜的DL架構的構建和試驗變得容易得多。此外,PyTorch的構建是為了與Python生態(tài)系統(tǒng)的數(shù)值計算基礎架構無縫集成,而Python是數(shù)據(jù)科學和機器學習的通用語言,它擺脫了這一日益流行的浪潮。
使用PyTorch進行Tensor操作
Tensors是任何DL框架的核心。PyTorch為程序員提供了極大的靈活性,使其可以在Tensors流經(jīng)與相對高級的面向?qū)ο驛PI配對的網(wǎng)絡(稱為計算圖)時創(chuàng)建,組合和處理Tensors。
什么是Tensors?
通過稱為Tensors的數(shù)據(jù)/數(shù)學結構來完成表示機器學習(ML)(尤其是DNN)的數(shù)據(jù)(例如,有關物理世界或某些業(yè)務流程的數(shù)據(jù)) 。Tensors是一個可以容納N 維數(shù)據(jù)的容器。Tensors經(jīng)常與另一個更熟悉的數(shù)學對象矩陣 (具體來說是二維Tensors)互換使用 。實際上,Tensors是二維矩陣到N維空間的推廣 。
用簡單的術語來說,可以將標量矢量矩陣Tensors視為一種流。
1)標量是0維Tensors。
2)向量是一維Tensors。
3)矩陣是二維Tensors
4)Tensors是廣義的N維 Tensors。N可以是3到無窮大的任何數(shù)字。
通常,這些尺寸也稱為 等級。
為什么Tensors對于ML和DL很重要?
考慮一個監(jiān)督的機器學習問題。您會得到帶有某些標簽的數(shù)據(jù)表(可以是數(shù)字實體或二進制分類,例如“是/否”答案)。為了使用ML算法對其進行處理,必須將數(shù)據(jù)作為數(shù)學對象進行饋送。表格自然等效于2-D矩陣,其中單個行(或?qū)嵗?或單個列(或要素)可以視為一維矢量。
類似地,黑白圖像可以視為包含數(shù)字0或1的2-D矩陣??梢詫⑵漭斎肷窠?jīng)網(wǎng)絡以進行圖像分類或分割任務。
時間序列或序列數(shù)據(jù)(例如,來自監(jiān)視機的ECG數(shù)據(jù)或股票市場價格跟蹤數(shù)據(jù)流)是二維(二維)數(shù)據(jù)的另一個示例,其中一維(時間)是固定的。
這些是在經(jīng)典ML(例如線性回歸,支持向量機,決策樹等)和DL算法中使用2-DTensors的示例。
超越二維,彩色或灰度圖像可被視為3-DTensors,其中每個像素都與所謂的“色彩通道”相關聯(lián)-“ 3-數(shù)字”矢量代表紅綠藍中的強度(RGB)光譜。這是一個3-DTensors的例子。
類似地,視頻可以被認為是時間上的彩色圖像(或幀)序列,并且可以被認為是4DTensors。
簡而言之,可以通過多維Tensors輕松表示來自物理世界,傳感器和儀器,商業(yè)和金融,科學或社會實驗的各種數(shù)據(jù),以使其適合在計算機內(nèi)部通過ML/DL算法進行處理。
讓我們看看PyTorch如何定義和處理Tensors。
在PyTorch中創(chuàng)建和轉換Tensors
可以從Python列表中定義Tensors,如下所示:
可以按以下方式訪問和索引實際元素
具有特定數(shù)據(jù)類型的Tensors可以輕松創(chuàng)建(例如,浮點數(shù))
尺寸和尺寸易于閱讀
我們可以更改Tensors的視圖。讓我們從一維Tensors開始,如下所示:
然后將視圖更改為二維Tensors,
在PyTorchTensors和NumPy數(shù)組之間來回切換既簡單又有效。
從熊貓系列對象進行轉換也很容易,
最后,可以轉換回Python列表,
使用PyTorch Tensors的向量和矩陣數(shù)學
PyTorch提供了一個易于理解的API和編程工具箱,以數(shù)學方式處理Tensors。我們在這里顯示一維和二維Tensors的基本操作。
簡單的向量加法
標量矢量乘法
線性組合
元素產(chǎn)品,
點積
在Tensors的每個元素上添加標量,即廣播,
從列表中創(chuàng)建二維Tensors,
矩陣元素的切片和索引
矩陣乘法
矩陣轉置
矩陣逆和行列式
Autograd:自動區(qū)分
神經(jīng)網(wǎng)絡的訓練和預測涉及一遍又一遍地獲取各種函數(shù)(Tensors值)的導數(shù)。Tensor對象支持神奇的Autograd功能,即自動微分,這是通過跟蹤和存儲在流過網(wǎng)絡的Tensors上執(zhí)行的所有操作來實現(xiàn)的。您可以觀看以下精彩的教程視頻以進行直觀說明:
Pytorch autograd 官方文檔在這里。
我們展示了一些簡單的示例來說明PyTorch的autograd功能。
我們定義一個泛型函數(shù)和一個Tensors變量 x,然后定義另一個變量 y, 將其分配給x的函數(shù) 。
然后,我們 在y上使用特殊的 向后()方法 獲取導數(shù),并在給定的x值下計算導數(shù) 。
我們還可以處理偏導數(shù)!
我們可以將u 和 v定義為Tensors變量,定義將它們組合在一起的函數(shù),應用反向方法,并計算偏導數(shù)。見下文,
PyTorch僅計算標量函數(shù)的導數(shù),但是如果我們傳遞矢量,則本質(zhì)上它將按元素計算導數(shù)并將它們存儲在相同維數(shù)的數(shù)組中。
以下代碼將針對三個組成矢量計算導數(shù)。
我們可以顯示導數(shù)的圖。注意,二次函數(shù)的導數(shù)是與拋物線曲線相切的直線。
建立完整的神經(jīng)網(wǎng)絡
除了Tensors和自動微分能力之外,PyTorch的其他核心組件/功能很少,可以對神經(jīng)網(wǎng)絡進行深入定義。
用于構建神經(jīng)分類器的PyTorch的核心組件是,
1) Tensors (在PyTorch中央數(shù)據(jù)結構)
2)Tensor 的 Autograd功能(自動微分公式烘焙到
3)nn.Module 用來建立任何其他神經(jīng)分類類類
4)優(yōu)化器 (當然,也有很多可供選擇)
5)損失 函數(shù)(一個大的選擇是供你選擇)
我們已經(jīng)詳細描述了Tensor和Autograd。讓我們快速討論其他組件,
nn.Module類
在PyTorch中,我們通過將其定義為自定義類來構建神經(jīng)網(wǎng)絡。但是,此類不是從本地Python對象派生的,而是從nn.Module類繼承的 。這為神經(jīng)網(wǎng)絡類注入了有用的屬性和強大的方法。這樣,在使用神經(jīng)網(wǎng)絡模型時,可以保持面向?qū)ο缶幊?OOP)的全部功能。我們將在大數(shù)據(jù)分析PyTorchx深度學習框架教程中看到此類定義的完整示例。
損失函數(shù)
在神經(jīng)網(wǎng)絡的架構和操作中,損失函數(shù)定義了神經(jīng)網(wǎng)絡的最終預測與地面真實情況(給定標簽/類或用于監(jiān)督訓練的數(shù)據(jù))之間的距離。損失的定量度量有助于使網(wǎng)絡更接近配置(神經(jīng)元權重的最佳設置),從而最好地對給定的數(shù)據(jù)集進行分類或預測總誤差最小的數(shù)值輸出。
PyTorch提供了用于分類和回歸任務的所有常見損失函數(shù)-
1)二元和多類交叉熵,
2)均方根和絕對絕對誤差,
3)L1損失平穩(wěn)
4)對數(shù)似然損失,甚至
5)Kullback-Leibler分歧。
可以在大數(shù)據(jù)分析PyTorchx深度學習框架教程中找到有關這些內(nèi)容的詳細討論。
優(yōu)化器
權重的優(yōu)化以實現(xiàn)最低的損失是用于訓練神經(jīng)網(wǎng)絡的反向傳播算法的核心。PyTorch通過torch.optim模塊提供了許多優(yōu)化器來完成這項工作-
1)隨機梯度下降(SGD),
2)亞當,阿達德塔,阿達格勒,SpareAdam,
3)L-BFGS,
4)RMSprop等
查看大數(shù)據(jù)分析PyTorchx深度學習框架教程以了解更多有關現(xiàn)代深度神經(jīng)網(wǎng)絡中使用的激活函數(shù)和優(yōu)化器的信息。
五步法
使用這些組件,我們將通過五個簡單的步驟構建分類器,
1)將神經(jīng)網(wǎng)絡構造為自定義類(繼承自 nn.Module 類),其中包含隱藏層Tensors以及用于通過各種層和激活函數(shù)傳播輸入Tensors的正向方法
2)使用forward() 方法在網(wǎng)絡中傳播特征Tensors(從數(shù)據(jù)集中) -說我們得到一個輸出Tensors
3)通過將輸出與地面真實情況進行比較并使用內(nèi)置損耗函數(shù)來計算損耗
4)使用自動微分能力(Autograd)和向后方法傳播損失的梯度
5)使用損耗的梯度來更新網(wǎng)絡的權重-這是通過執(zhí)行所謂的優(yōu)化器-optimizer.step()的一個步驟來完成的。
就是這樣。這個五步過程構成了 一個完整的培訓時期。我們只重復一遍,以降低損失并獲得較高的分類精度。
這個主意如下:
動手實例
假設我們要構建和訓練以下2層神經(jīng)網(wǎng)絡。
我們從類定義開始,
我們可以將變量定義為屬于此類的對象,然后打印摘要。
我們選擇二進制交叉熵損失,
讓我們通過已定義的神經(jīng)網(wǎng)絡模型運行輸入數(shù)據(jù)集,即 一次向前通過并計算輸出概率。由于權重已初始化為隨機,因此我們將看到隨機輸出概率(大多數(shù)接近0.5)。 該網(wǎng)絡尚未訓練。
我們定義優(yōu)化器
接下來,我們展示如何使用優(yōu)化程序的一個步驟進行正向和反向傳遞。 可以在任何PyTorch神經(jīng)網(wǎng)絡模型的核心找到這組代碼。我們遵循另外五個步驟
1)將漸變重置為零(以防止?jié)u變累積)
2)將Tensors向前穿過層
3)計算損失Tensors
4)計算損失的梯度
5)通過將優(yōu)化器增加一級(沿負梯度的方向)來更新權重
上面的五個步驟 正是您在有關神經(jīng)網(wǎng)絡和深度學習的所有理論討論中(以及在教科書中)可以觀察和了解的。而且,借助PyTorch,您可以逐步使用看似簡單的代碼來實現(xiàn)此過程。
代碼如下所示
當 我們在一個循環(huán)上(對于多個時期)運行相同類型的代碼時,我們可以觀察到熟悉的損耗曲線下降,即神經(jīng)網(wǎng)絡逐漸受到訓練。
在訓練了200個時期之后,我們可以再次直接查看概率分布,以查看神經(jīng)網(wǎng)絡輸出概率現(xiàn)在有何不同(嘗試與真實數(shù)據(jù)分布匹配)。
PyTorch基礎知識摘要
PyTorch是一個很好的軟件包,可用于深入神經(jīng)網(wǎng)絡的核心并針對您的應用對其進行自定義,或者嘗試使用網(wǎng)絡的體系結構,優(yōu)化和機制來嘗試大膽的新想法。
您可以輕松地構建復雜的互連網(wǎng)絡,嘗試新穎的激活函數(shù),混合并匹配自定義損失函數(shù)等。計算圖,輕松的自動微分以及Tensors的正向和反向流動的核心思想將對您的任何人都很方便神經(jīng)網(wǎng)絡定義和優(yōu)化。
在大數(shù)據(jù)分析PyTorchx深度學習框架教程中,我們總結了一些關鍵步驟,可以遵循這些關鍵步驟來快速構建用于分類或回歸任務的神經(jīng)網(wǎng)絡。我們還展示了如何使用此框架輕松地嘗試巧妙的想法。
填寫下面表單即可預約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業(yè)?一地學習,可推薦就業(yè)!
?2007-2022/ mwtacok.cn 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc