天天看點

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

背景

深度神經網絡模型是目前火熱的人工智能的基石,深度神經網絡模型可以應用于房價預測、股票預測、人臉識别、自動駕駛等各種場景。本文将詳細講解如何使用python從零開始搭建一個神經網絡模型,并應用于房價預測。

摘要

  1. 房價資料介紹
  2. 深度神經網絡介紹
  3. 神經網絡前後向傳播計算詳解
  4. 訓練深度神經網絡模型并預測房價
  5. 總結

代碼

話不多說,先上代碼。人生苦短,我愛python。

https://github.com/hellobilllee/dnn_house_price_prediction_scratch

房價資料介紹

本文将預測波士頓郊區自住房屋價格的中位數。使用波士頓房價(BostonHousePrice)資料集,一部分資料用于訓練模型,另一部分資料用于驗證模型的效果。資料下載下傳位址:https://archive.ics.uci.edu/ml/machine-learning-databases/housing/

波士頓房價資料說明:此資料源于美國某經濟學雜志,用于分析研究波士頓房價,共包含506行,14列。資料集中的每一行對應于影響波士頓某一城鎮房價的各種資料,比如犯罪率、當地房産稅率等。本資料集資訊次元僅用于分析研究,在中國,是否是學區房等資訊也是房産價格的重要參考名額。

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

資料示例

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

 資料名稱解釋

本文預測目标為MEDV(自住房屋房價中位數,也就是均價)。假設目前我們的深度神經網絡模型已經訓練好了,我們将某一城鎮住房除需要預測的房屋均價外其它資訊輸入到網絡當中,神經網絡會輸出一個預測的房屋均價值,可以通過比較預測值與實際值之間的偏差大小來評估神經網絡的預測效果。

神經網絡介紹

典型神經網絡結構

典型的神經網絡結構如下圖所示,包含輸入層、隐藏層(可以有多層)和輸出層。每一層當中包含很多存儲資料的節點,稱之為神經元,每一個神經元都與下一層所有神經元連接配接,每一對連接配接都有對應的一個參數。這種連接配接維持了神經元之間資訊的傳遞,資訊的傳遞其實就是一個數學計算過程。

前向傳播過程輸入資訊由輸入層->隐藏層->輸出層。

後向傳播過程更新資訊由輸出層->隐藏層->輸入層。

預測的時候,輸入原始資料資訊到輸入層,經過中間層的數學計算,得到輸出,即房屋均價;訓練的時候,先進行前向傳輸預測得到房屋均價輸出,然後根據輸出與實際房屋均價的差距,進行後向傳播,這個過程會調整網絡之中的參數,進而使得下一次預測更為準确。

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

深度神經網絡結構

前向傳播計算公式

前向傳播時每一層計算公式:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

l 表示第l 層,W表示第l 層的參數矩陣,X表示第l -1 層的輸入資料矩陣,f 表 示某類數學函數,也稱激活函數。常用激活函數有ReLU, Sigmoid, TanH, Identity。

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

計算公式展開

假設使用Sigmoid激活函數,則:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

輸出y的計算為:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

本文預測房屋均價,為回歸問題,輸出使用Identity函數,是以預測值為:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

假設真實的房價為, 則預測值與真實值的絕對誤差(MAE)為:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

當然也可以采用别的損失函數來衡量預測與實際值的差别,比如均方誤差(MSE)。

後向傳播過程就是根據預測值與真實值的差距大小逐層對網絡參數進行調整,使得預測值與真實值一緻。

網絡參數初始化

神經網絡參數通過後向傳播不斷優化,使得模型預測值與真實值接近。一開始我們并不知道最優參數值,需要對參數進行随機初始化。對參數進行怎樣的随機初始化其實也很有講究,特别是對于深度神經網絡。本文當中,我們使用xavier初始化方法,源自論文“Understanding the difficulty of training deep feedforward neuralnetworks”。假設我們輸入層神經元為2,隐藏層神經元為3,則連接配接這兩層之間的參數進行初始化代碼如下:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

前向傳播

參數初始化及輸入資料到隐藏層

我們已經知道,輸入資訊在網絡當中逐層向前傳播并最終得到輸出的過程叫做前向傳播,每經過一層都會進行一系列數學計算。假設現在我們将資料集當中的第一條資訊輸入到網絡當中,當然,預測目标MEDV不能輸入進去。

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

除去MEDV外,一共還有13個資料,這13個資料将被輸入到輸入層的13個神經元當中,輸入層的神經元個數與輸入資料的資訊次元一緻,我們将輸入資料表示為inputs。

接下來,輸入層資料将通過輸入層與隐藏層之間的連接配接,通過計算被傳播到隐藏層。隐藏層神經元的個數可以自己随意确定,一般比輸入層的神經元個數多,通常可以通過經驗結合實驗進行合理設定。這裡我們将第一層隐藏層的神經元個數設定為16個,那麼輸入層與第一個隐藏層之間的連接配接個數為13*16=208,這種相鄰層之間每一對神經元都有連接配接的參數層我們稱之為全連接配接層。

我們習慣将資料用矩陣表示,這樣友善進行數學計算。比如輸入一條資料時,inputs就是一個[1,13]的矩陣,表示長度為1,寬度為13,共儲存有1*13=13個資料,而此時第一層全連接配接層的權重參數為[13,16]的矩陣,表示長度為13,寬度為16,共儲存有13*16=208個資料。

我們可以通過上面的參數初始化函數對參數進行初始化,然後按照前向傳播計算公式計算隐藏層神經元的輸入。代碼如下:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

可以看到,通過對輸入和連接配接參數進行計算,我們可以得到一個16維的輸出,分别對應于第一個隐藏層16個神經元。将這一步計算好的資料輸入第一個隐藏層16個神經元之前,還需要給每一個結果加上一個偏置(bias),即給每一個結果再加上一個随機數,這樣做的原因主要是接下來我們需要将輸入隐藏層的結果輸出到激活函數當中去,而這個随機數有助于調整激活函數在目标參數空間中左右移動,使得神經網絡有更大的靈活性和更強的學習能力。我們可以給inputs增加一維恒為1的資料,然後在全連接配接參數層輸入端多添加一個權重參數達到同樣的目的。在文字稿中,我們并不引入bias資料,但是在實際訓練的代碼當中會加入進去。batch_size表示我們一次性輸入到網絡的資料條數,比如我們現在是一條一條輸入,那麼batch_size就等于1.

隐藏層輸入資料過激活函數

現在我們得到了第一個隐藏層的輸入資料,接下來我們需要将該層每一個神經元的資料輸入到激活函數得到隐藏層的輸出。這裡我們使用sigmoid激活函數,代碼如下:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

隐藏層輸出資料至輸出層

接下去需要将第一個隐藏層的輸出資料進一步往前傳播。隐藏層可以有多個,這裡我們隻使用一個隐藏層。每一層的操作過程和上面的基本一樣,都是:

“上層輸出矩陣乘目前全連接配接層參數->加偏置->輸入激活函數->輸出“

輸出層的激活函數使用Identity函數,其實這裡不應該叫激活函數了,叫輸出轉換函數更合适,但是這樣可以将輸出層看成和隐層一樣,更友善了解。通常進行連續值的預估的時候,輸出層使用Identity函數(其實就是線性函數,且是原樣輸出那種),而進行離散值的預估的時候,輸出層使用Sigmoid函數。所謂連續值,比如房價,是在一個連續的範圍内波動的;而離散值,比如識别一張圖檔裡面是貓還是狗,就隻需要區分出有限的值即可。

隐藏層的資料繼續傳播到輸出層的代碼如下:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

可以看出,結果為負值,與實際值(24.0)相差十萬八千裡。這是因為網絡還沒有通過後向傳播調整連接配接網絡層之間的參數值,通過不斷地輸入樣本進行反複學習和更新網絡參數,強化神經網絡地預測能力。接下來,我們将繼續通過代碼學習神經網絡後向傳播。

後向傳播

在網絡未學習之前,是沒有預測能力的,比如上面我們通過前向傳播預測的結果與實際值相差甚遠。所謂神經網絡的學習,其實就是不斷地調整連接配接各個網絡層的參數,使得最終計算結果能夠與實際值一緻或者接近。整個調整過程,被稱為後向傳播。

首先我們需要計算出預估值與實際值之間的差距,這個差距是網絡層中的所有參數一起造成的,但是每一個參數對這個錯誤的影響是不一樣的,是以我們要根據某種規則來調整每一個參數,常用的調整規則稱為梯度下降算法(GD,Gradient Decent)。

我們根據預測誤差大小調整最後一個全連接配接層之間的參數,然後根據該層的輸入和後向傳播的誤差,逐層往前調整參數。我們可以每過一條資料就更新一次參數,也可以過幾條資料後通過累計誤差來更新一次參數,也可以在訓練資料集中随機選擇一些資料而不是所有資料來訓練,上面的方法依次被稱為梯度下降、批量梯度下降、随機梯度下降。

計算預估誤差

我們首先計算預估值與實際值之間的差距,本文中使用均方誤差來衡量這種差距:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

然後我們計算輸出層神經元輸出值需要調整的大小:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

可以看到這樣調整後預測結果就應該等于真實值,但是我們的步子一下不能邁這麼大,因為當輸入下一條不同的樣本,這麼調整預測效果可能就不好,是以後面調整的時候我們會有一個所謂學習率(lr, learning rate)的參數,這個參數控制權重調整的幅度。使用均方誤差做損失函數來衡量誤差,其梯度為2*(predict-label),常數項2通常省略,可以了解為将學習率調小了兩倍。

調整第二個參數層參數

接下來我們計算連接配接隐藏層與輸出層的全連接配接層參數需要調整的大小。由于輸出層神經元的輸出值等于其輸入值,而其輸入值由隐藏層的輸出與參數共同決定,是以該全連接配接層參數大小的調整,需要參考隐藏層輸出值大小,其實就是與對應的輸出值的大小成正比:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

接下來我們可以開始調整該全連接配接層參數(使用reshape是為了節約展示空間,實際中不用),我們使用了最簡單的梯度下降算法,學習率lr=0.001:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

計算隐藏層激活函數輸入輸出梯度

現在連接配接隐藏層與輸出層的參數調整了一次,接下來還需要調整連接配接輸入層和隐藏層的參數。但是隐藏層輸出前還經過了一個sigmoid激活函數,是以這裡需要計算經過sigmoid函數前後隐藏層需要調整的梯度大小。

首先計算經過sigmoid後需要調整的梯度,這裡直接将輸出層需要調整的梯度點乘該全連接配接層的參數即可:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

然後計算經過sigmoid前需要調整的梯度,這裡需要求sigmoid函數的導數:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

調整第一個參數層的參數

現在可以開始更新連接配接輸入層和隐藏層之間的參數了,計算過程和更新隐藏層和輸出層之間的參數一樣。

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

現在我們已經通過輸入一條資料,前向傳播做預測,根據預估誤差做後向傳播,調整了一次連接配接各網絡層的參數。我們不斷地輸入資料,反複地更新網絡參數,直到誤差足夠小,或者我們覺得學習時間夠了,那麼我們的神經網絡模型就算學好了。

我們将學習好的網絡參數儲存下來,通過輸入新資料,即神經網絡從來沒有見過的資料,測試神經網絡的預測能力。

接下來我們就通過波士頓房價(Boston HousePrice)資料集,将前4/5的資料用于訓練,後1/5資料用作測試,來看看神經網絡的學習能力和預測能力。

訓練深度神經網絡模型并預測房價

整個項目結構如下圖所示,包含一個資料目錄和代碼目錄。代碼目錄包含激活函數(層),資料處理,全連接配接層,初始化,損失函數(層),評估名額計算,網絡搭建,梯度優化器這幾個子產品:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

首先我們導入一些資料處理和畫圖所需要的包:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

然後我們讀取資料,列印資料大小,檢視資料示例:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

然後将待預測的資料标簽與輔助訓練的資料資訊分開,最後一列為待預測房價資料标簽:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

對資料進行減均值除方差的标準化處理,這樣做有助于神經網絡的收斂(學習),然後使用4/5的資料做訓練資料,剩下的1/5資料做測試資料:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

定義一些神經網絡的參數,如疊代次數(num_iterations,學習次數),學習率(lr, 調節參數更新幅度),一次學習的資料大小(train_batch_size),還有一些早停參數(防止學習過猛), train_error用于記錄每次學習誤差:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

然後可以使用資料處理子產品(DataHander),優化器子產品(Optimizer),資料初始化子產品(Initializer),網絡搭模組化塊(DNNnet),批量讀取資料并搭建深度神經網絡:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

接下來可以開始訓練了,每次拉取一批資料data_handler.pull_data(),然後進行前向傳播dnn.forward_train(),後向傳播dnn.backward_train(),更新參數dnn.update(),記錄訓練誤差train_error.append(dnn.loss.loss),這個過程反複很多次,直到訓練誤差連續15次都沒有降低( 通過early_stopping_iter參數進行設定):

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

我們可以看到,第一次訓練,神經網絡的預測值跟真實值完全不搭邊,但是訓練到第71次的時候,預測值與真實值已經很接近了:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

我們可以來看一下随着訓練次數增加訓練誤差的變化趨勢圖。可以看到訓練誤差是在不斷減小的,但是當中在不斷的波動,這是因為我們的資料集比較小,而我們使用的batch_size也比較小,如果不同樣本間差異比較大的話,很容易出現這種波動,同時訓練學習率影響也非常大:

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

總結

本文我們簡單介紹了一下神經網絡的定義,神經網絡怎麼做前向傳播得到輸出,怎麼做後向傳播更新網絡參數,然後使用python從零開始搭建了一個深度神經網絡模型,并用于房價預測。可以看到,深度神經網絡模型在訓練前預測能力基本沒有,訓練後預測能力急劇提升,可見神經網絡強大的學習能力。如何進一步提升神經網絡的預測能力?大家可以試試調節網絡參數,網絡結構,優化方法等。水準有限,如有疑問或者建議,歡迎留言交流。代碼免費開源給大家,如果各位爺覺得哎喲不錯是幹貨,那就點個在看或關注支援一下吧

bp神經網絡預測python代碼_純Python搭建一個深度神經網絡并用于房價預測背景摘要房價資料介紹神經網絡介紹典型神經網絡結構前向傳播訓練深度神經網絡模型并預測房價總結

代碼位址:下載下傳後直接運作run.py即可得到上圖訓練曲線

https://github.com/hellobilllee/dnn_house_price_prediction_scratch

繼續閱讀