PyTorch已為我們實(shí)現(xiàn)了大多數(shù)常用的非線性激活函數(shù),我們可以像使用任何其他的層那樣使用它們。讓我們快速看一個(gè)在PyTorch中使用ReLU激活函數(shù)的例子:
在上面這個(gè)例子中,輸入是包含兩個(gè)正值、兩個(gè)負(fù)值的張量,對(duì)其調(diào)用ReLU函數(shù),負(fù)值將取為0,正值則保持不變。
現(xiàn)在我們已經(jīng)了解了構(gòu)建神經(jīng)網(wǎng)絡(luò)架構(gòu)的大部分細(xì)節(jié),我們來構(gòu)建一個(gè)可用于解決真實(shí)問題的深度學(xué)習(xí)架構(gòu)。上一章中,我們使用了簡單的方法,因而可以只關(guān)注深度學(xué)習(xí)算法如何工作。后面將不再使用這種方式構(gòu)建架構(gòu),而是使用PyTorch中正常該用的方式構(gòu)建。
1.PyTorch構(gòu)建深度學(xué)習(xí)算法的方式
PyTorch中所有網(wǎng)絡(luò)都實(shí)現(xiàn)為類,創(chuàng)建PyTorch類的子類要調(diào)用nn.Module,并實(shí)現(xiàn)__init__和forward方法。在init方法中初始化層,這一點(diǎn)已在前一節(jié)講過。在forward方法中,把輸入數(shù)據(jù)傳給init方法中初始化的層,并返回最終的輸出。非線性函數(shù)經(jīng)常被forward函數(shù)直接使用,init方法也會(huì)使用一些。下面的代碼片段展示了深度學(xué)習(xí)架構(gòu)是如何用PyTrorch實(shí)現(xiàn)的:
如果你是Python新手,上述代碼可能會(huì)比較難懂,但它全部要做的就是繼承一個(gè)父類,并實(shí)現(xiàn)父類中的兩個(gè)方法。在Python中,我們通過將父類的名字作為參數(shù)傳入來創(chuàng)建子類。init方法相當(dāng)于Python中的構(gòu)造器,super方法用于將子類的參數(shù)傳給父類,我們的例子中父類就是nn.Module。
2.不同機(jī)器學(xué)習(xí)問題的模型架構(gòu)
待解決的問題種類將基本決定我們將要使用的層,處理序列化數(shù)據(jù)問題的模型從線性層開始,一直到長短期記憶(LSTM)層?;谝鉀Q的問題類別,最后一層是確定的。使用機(jī)器學(xué)習(xí)或深度學(xué)習(xí)算法解決的問題通常有三類,最后一層的情況通常如下。
?對(duì)于回歸問題,如預(yù)測T恤衫的銷售價(jià)格,最后使用的是有一個(gè)輸出的線性層,輸出值為連續(xù)的。
?將一張給定的圖片歸類為T恤衫或襯衫,用到的是sigmoid激活函數(shù),因?yàn)樗妮敵鲋挡皇墙咏?就是接近0,這種問題通常稱為二分類問題。
?對(duì)于多類別分類問題,如必須把給定的圖片歸類為T恤、牛仔褲、襯衫或連衣裙,網(wǎng)絡(luò)最后將使用softmax層。讓我們拋開數(shù)學(xué)原理來直觀理解softmax的作用。舉例來說,它從前一線性層獲取輸入,并輸出給定數(shù)量樣例上的概率。在我們的例子中,將訓(xùn)練它預(yù)測每個(gè)圖片類別的4種概率。記住,所有概率相加的總和必然為1。
3.損失函數(shù)
一旦定義好了網(wǎng)絡(luò)架構(gòu),還剩下最重要的兩步。一步是評(píng)估網(wǎng)絡(luò)執(zhí)行特定的回歸或分類任務(wù)時(shí)表現(xiàn)的優(yōu)異程度,另一步是優(yōu)化權(quán)重。
優(yōu)化器(梯度下降)通常接受一個(gè)標(biāo)量值,因而loss函數(shù)應(yīng)生成一個(gè)標(biāo)量值,并使其在訓(xùn)練期間最小化。某些用例,如預(yù)測道路上障礙物的位置并判斷是否為行人,將需要兩個(gè)或更多損失函數(shù)。即使在這樣的場景下,我們也需要把損失組合成一個(gè)優(yōu)化器可以最小化的標(biāo)量。最后一章將詳細(xì)討論把多個(gè)損失值組合成一個(gè)標(biāo)量的真實(shí)例子。
上一章中,我們定義了自己的loss函數(shù)。PyTorch提供了經(jīng)常使用的loss函數(shù)的實(shí)現(xiàn)。我們看看回歸和分類問題的loss函數(shù)。
回歸問題經(jīng)常使用的loss函數(shù)是均方誤差(MSE)。它和前面一章實(shí)現(xiàn)的loss函數(shù)相同??梢允褂肞yTorch中實(shí)現(xiàn)的loss函數(shù),如下所示:
對(duì)于分類問題,我們使用交叉熵?fù)p失函數(shù)。在介紹交叉熵的數(shù)學(xué)原理之前,先了解下交叉熵?fù)p失函數(shù)做的事情。它計(jì)算用于預(yù)測概率的分類網(wǎng)絡(luò)的損失值,損失總和應(yīng)為1,就像softmax層一樣。當(dāng)預(yù)測概率相對(duì)正確概率發(fā)散時(shí),交叉熵?fù)p失增加。例如,如果我們的分類算法對(duì)圖3.5為貓的預(yù)測概率值為0.1,而實(shí)際上這是只熊貓,那么交叉熵?fù)p失就會(huì)更高。如果預(yù)測的結(jié)果和真實(shí)標(biāo)簽相近,那么交叉熵?fù)p失就會(huì)更低。
下面是用Python代碼實(shí)現(xiàn)這種場景的例子。
為了在分類問題中使用交叉熵?fù)p失,我們真的不需要擔(dān)心內(nèi)部發(fā)生的事情——只要記住,預(yù)測差時(shí)損失值高,預(yù)測好時(shí)損失值低。PyTorch提供了loss函數(shù)的實(shí)現(xiàn),可以按照如下方式使用。
PyTorch包含的其他一些loss函數(shù)如表3.1所示。
表3.1
L1 loss 通常作為正則化器使用;第4章將進(jìn)一步講述
MSE loss 均方誤差損失,用于回歸問題的損失函數(shù)
Cross-entropy loss 交叉熵?fù)p失,用于二分類和多類別分類問題
NLL Loss 用于分類問題,允許用戶使用特定的權(quán)重處理不平衡數(shù)據(jù)集
NLL Loss2d 用于像素級(jí)分類,通常和圖像分割問題有關(guān)
4.優(yōu)化網(wǎng)絡(luò)架構(gòu)
計(jì)算出網(wǎng)絡(luò)的損失值后,需要優(yōu)化權(quán)重以減少損失,并改善算法準(zhǔn)確率。簡單起見,讓我們看看作為黑盒的優(yōu)化器,它們接受損失函數(shù)和所有的學(xué)習(xí)參數(shù),并微量調(diào)整來改善網(wǎng)絡(luò)性能。PyTorch提供了深度學(xué)習(xí)中經(jīng)常用到的大多數(shù)優(yōu)化器。如果大家想研究這些優(yōu)化器內(nèi)部的動(dòng)作,了解其數(shù)學(xué)原理,強(qiáng)烈建議瀏覽以下博客:
PyTorch提供的一些常用的優(yōu)化器如下:
?ADADELTA
?Adagrad
?Adam
?SparseAdam
?Adamax
?ASGD
?LBFGS
?RMSProp
?Rprop
?SGD
審核編輯 黃昊宇
-
非線性
+關(guān)注
關(guān)注
1文章
206瀏覽量
23043 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4286瀏覽量
62335 -
pytorch
+關(guān)注
關(guān)注
2文章
802瀏覽量
13120
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論