日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

除非你能學(xué)習(xí)到一些東西,否則不要重復(fù)造輪子。

強(qiáng)大的庫已經(jīng)存在了,如:TensorFlow,PyTorch,Keras等等。我將介紹在Python/ target=_blank class=infotextkey>Python中創(chuàng)建多層感知器(MLP)神經(jīng)網(wǎng)絡(luò)的基本知識(shí)。

感知器是神經(jīng)網(wǎng)絡(luò)的基本組成部分。感知器的輸入函數(shù)是權(quán)重,偏差和輸入數(shù)據(jù)的線性組合。具體來說:in_j = weight input + bias.(in_j =權(quán)重輸入+偏差)。在每個(gè)感知器上,我們都可以指定一個(gè)激活函數(shù)g。

激活函數(shù)是一種確保感知器“發(fā)射”或僅在達(dá)到一定輸入水平后才激活的數(shù)學(xué)方法。常見的非線性激活函數(shù)為S型,softmax,整流線性單位(ReLU)或簡單的tanH。

激活函數(shù)有很多選項(xiàng),但是在本文中我們僅涉及Sigmoid和softmax。

圖1:感知器

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

對(duì)于有監(jiān)督的學(xué)習(xí),我們稍后將輸入的數(shù)據(jù)通過一系列隱藏層轉(zhuǎn)發(fā)到輸出層。這稱為前向傳播。在輸出層,我們能夠輸出預(yù)測y。通過我們的預(yù)測y,我們可以計(jì)算誤差| y*-y | 并使誤差通過神經(jīng)網(wǎng)絡(luò)向后傳播。這稱為反向傳播。通過隨機(jī)梯度下降(SGD)過程,將更新隱藏層中每個(gè)感知器的權(quán)重和偏差。

圖2:神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

現(xiàn)在我們已經(jīng)介紹了基礎(chǔ)知識(shí),讓我們實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)。我們的神經(jīng)網(wǎng)絡(luò)的目標(biāo)是對(duì)MNIST數(shù)據(jù)庫中的手寫數(shù)字進(jìn)行分類。我將使用NumPy庫進(jìn)行基本矩陣計(jì)算。

在我們的問題中,MNIST數(shù)據(jù)由 [748,1] 矩陣中的8位顏色通道表示。從本質(zhì)上講,我們有一個(gè) [748,1] 的數(shù)字矩陣,其始于[0,1,.... 255],其中0表示白色,255表示黑色。

結(jié)果

MNIST手寫數(shù)字?jǐn)?shù)據(jù)庫包含60,000個(gè)用于訓(xùn)練目的的手寫示例和10,000個(gè)用于測試目的的示例。在對(duì)60,000個(gè)示例進(jìn)行了30個(gè)epoch的訓(xùn)練之后,我在測試數(shù)據(jù)集上運(yùn)行了經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)絡(luò),并達(dá)到了93.2%的準(zhǔn)確性。甚至可以通過調(diào)整超參數(shù)來進(jìn)一步優(yōu)化。

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

它是如何工作的?

本文分為5個(gè)部分。這些部分是:

(1)激活函數(shù) (2)權(quán)重初始化 (3)偏差初始化 (4)訓(xùn)練算法 (5)進(jìn)行預(yù)測

1. 激活函數(shù)

Sigmoid是由等式1 /(1+ exp(-x))定義的激活函數(shù),將在隱藏層感知器中使用。

Softmax是一個(gè)激活函數(shù),當(dāng)我們要將輸入分為幾類時(shí),它通常在輸出層中使用。在我們的例子中,我們希望將一個(gè)數(shù)字分成10個(gè)bucket[0,1,2,…,9]中的一個(gè)。它計(jì)算矩陣中每個(gè)條目的概率;概率將總計(jì)為1。具有最大概率的條目將對(duì)應(yīng)于其預(yù)測,即0,1,…,9。Softmax定義為exp(x)/ sum(exp(x))。

圖3:激活函數(shù)的實(shí)現(xiàn)

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

2. 權(quán)重初始化

對(duì)于我們的每個(gè)隱藏層,我們將需要初始化權(quán)重矩陣。有幾種不同的方法可以做到這一點(diǎn),這里是4。

  1. 零初始化-初始化所有權(quán)重= 0。
  2. 隨機(jī)初始化-使用隨機(jī)數(shù)初始化權(quán)重,而不是完全隨機(jī)。我們通常使用標(biāo)準(zhǔn)正態(tài)分布(均值0和方差1)中的隨機(jī)數(shù)。
  3. Xavier初始化-使用具有設(shè)定方差的正態(tài)分布中的隨機(jī)數(shù)初始化權(quán)重。我們將基于上一層的大小設(shè)置方差。

如上所述,進(jìn)入感知器的邊緣乘以權(quán)重矩陣。關(guān)鍵的一點(diǎn)是,矩陣的大小取決于當(dāng)前圖層的大小以及它之前的圖層。明確地,權(quán)重矩陣的大小為[currentLayerSize,previousLayerSize]。

如上所述,進(jìn)入感知器的邊緣乘以權(quán)重矩陣。關(guān)鍵的一點(diǎn)是,矩陣的大小取決于當(dāng)前圖層的大小以及它之前的圖層。明確地,權(quán)重矩陣的大小為[currentLayerSize,previousLayerSize]。

假設(shè)我們有一個(gè)包含100個(gè)節(jié)點(diǎn)的隱藏層。我們的輸入層的大小為[748,1],而我們所需的輸出層的大小為[10,1]。輸入層和第一個(gè)隱藏層之間的權(quán)重矩陣的大小為[100,748]。隱藏層之間的每個(gè)權(quán)重矩陣的大小為[100,100]。最后,最終隱藏層和輸出層之間的權(quán)重矩陣的大小為[10,100]。

出于教育目的,我們將堅(jiān)持使用單個(gè)隱藏層;在最終模型中,我們將使用多層。

圖4:權(quán)重初始化實(shí)現(xiàn)

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

3. 偏差初始化

像權(quán)重初始化一樣,偏置矩陣的大小取決于圖層大小,尤其是當(dāng)前圖層大小。偏置初始化的一種方法是將偏置設(shè)置為零。

對(duì)于我們的實(shí)現(xiàn),我們將需要為每個(gè)隱藏層和輸出層提供一個(gè)偏差。偏置矩陣的大小為[100,1],基于每個(gè)隱藏層100個(gè)節(jié)點(diǎn),而輸出層的大小為[10,1]。

圖5:偏置初始化實(shí)現(xiàn)

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

4. 訓(xùn)練算法

前面已經(jīng)說過,訓(xùn)練是基于隨機(jī)梯度下降(SGD)的概念。在SGD中,我們一次只考慮一個(gè)訓(xùn)練點(diǎn)。

在我們的示例中,我們將在輸出層使用softmax激活。將使用“交叉熵?fù)p失”公式來計(jì)算損失。對(duì)于SGD,我們將需要使用softmax來計(jì)算交叉熵?fù)p失的導(dǎo)數(shù)。也就是說,此導(dǎo)數(shù)減少為y -y,即預(yù)測y減去期望值y。

圖6:關(guān)于softmax激活的交叉熵?fù)p失及其導(dǎo)數(shù)

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

我們還需要編寫S型激活函數(shù)的導(dǎo)數(shù)。在圖7中,我定義了S型函數(shù)及其衍生函數(shù)

圖7:Sigmoid函數(shù)(上)及其導(dǎo)數(shù)(下)

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

通常,神經(jīng)網(wǎng)絡(luò)將允許用戶指定幾個(gè)“超參數(shù)”。在我們的實(shí)施中,我們將著重于允許用戶指定epoch,批處理大小,學(xué)習(xí)率和動(dòng)量。還有其他優(yōu)化技術(shù)!

  1. 學(xué)習(xí)率(LR):學(xué)習(xí)率是一個(gè)參數(shù),用戶可以通過它指定網(wǎng)絡(luò)允許我們學(xué)習(xí)和更新其參數(shù)的速度。選擇一個(gè)好的學(xué)習(xí)率是一門藝術(shù)。如果LR太高,我們可能永遠(yuǎn)不會(huì)收斂于良好的可接受的訓(xùn)練錯(cuò)誤。如果LR太低,我們可能會(huì)浪費(fèi)大量的計(jì)算時(shí)間。
  2. epoch:epoch是整個(gè)訓(xùn)練集中的一個(gè)迭代。為了確保我們不會(huì)過度擬合早期樣本中的數(shù)據(jù),我們會(huì)在每個(gè)時(shí)期之后對(duì)數(shù)據(jù)進(jìn)行隨機(jī)排序。
  3. 批次大小:通過Epoc2h的每次迭代,我們將分批訓(xùn)練數(shù)據(jù)。對(duì)于批次中的每個(gè)訓(xùn)練點(diǎn),我們將收集梯度,并在批次完成后更新權(quán)重/偏差。
  4. 動(dòng)量:這是一個(gè)參數(shù),我們將通過收集過去的梯度的移動(dòng)平均值并允許在該方向上的運(yùn)動(dòng)來加速學(xué)習(xí)。在大多數(shù)情況下,這將導(dǎo)致更快的收斂。典型值范圍從0.5到0.9。

下面,我編寫了一些通用的偽代碼來模擬反向傳播學(xué)習(xí)算法的概況。為了便于閱讀,已將諸如計(jì)算輸出和將訓(xùn)練數(shù)據(jù)分成批次之類的任務(wù)作為注釋編寫。

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

現(xiàn)在,我們將展示偽代碼的實(shí)現(xiàn).

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

5. 做出預(yù)測

現(xiàn)在,我們僅缺少此實(shí)現(xiàn)的一個(gè)關(guān)鍵方面。預(yù)測算法。在編寫反向傳播算法的過程中,我們已經(jīng)完成了大部分工作。我們只需要使用相同的前向傳播代碼即可進(jìn)行預(yù)測。輸出層的softmax激活函數(shù)將計(jì)算大小為[10,1]的矩陣中每個(gè)條目的概率。

我們的目標(biāo)是將數(shù)字分類為0到9。因此,aj2矩陣的索引將與預(yù)測相對(duì)應(yīng)。概率最大的索引將由np.argmax()選擇,并將作為我們的預(yù)測。

用Python實(shí)現(xiàn)多層感知器神經(jīng)網(wǎng)絡(luò)

 

結(jié)論

這就對(duì)了!我們結(jié)束了。我們已經(jīng)用Python編寫了神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)。

但是,我們?nèi)绾芜x擇最佳參數(shù)?我們可以使用算法的一般知識(shí)來選擇有意義的超參數(shù)。我們需要選擇能概括但不能過度擬合數(shù)據(jù)的超參數(shù)。我們可以調(diào)整動(dòng)量,學(xué)習(xí)率,時(shí)期數(shù),批處理大小和隱藏節(jié)點(diǎn)的數(shù)量,以實(shí)現(xiàn)我們的目標(biāo)。向前邁出一步,我們可以編寫更多算法來為我們做這件事!

遺傳算法是一種AI算法,可用于選擇最佳參數(shù)。遺傳算法的思想是創(chuàng)建一組具有不同參數(shù)的子代,并讓他們產(chǎn)生與參數(shù)相關(guān)的測試錯(cuò)誤。我們可以對(duì)具有最佳超參數(shù)的神經(jīng)網(wǎng)絡(luò)進(jìn)行繁殖和變異,以找到性能更好的參數(shù)。花費(fèi)大量時(shí)間后,我們將能夠?qū)W習(xí)有關(guān)超參數(shù)情況的大量知識(shí),并找到新的最佳超參數(shù)值。

我們還可以采取其他措施來減少測試錯(cuò)誤嗎?是的,我們可以縮放輸入數(shù)據(jù)。像許多算法一樣,數(shù)量更多會(huì)對(duì)算法的結(jié)果產(chǎn)生重大影響。在我們的示例中,數(shù)字范圍為[0到255]。如果我們按比例縮放數(shù)字,使它們的范圍從[0到1],則可以減少該偏差。

分享到:
標(biāo)簽:神經(jīng)網(wǎng)絡(luò)
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定