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