機器學習:python使用BP神經網絡示例


1.簡介(只是簡單介紹下理論內容幫助理解下面的代碼,如果自己寫代碼實現此理論不夠)

       1) BP神經網絡是一種多層網絡算法,其核心是反向傳播誤差,即: 使用梯度下降法(或其他算法),通過反向傳播來不斷調整網絡的權值和閾值,使網絡的誤差平方和最小。

      BP神經網絡模型拓撲結構包括輸入層(input)、隱藏層(hidden layer)和輸出層(output layer),每層包含多個神經元。

      2)BP神經網絡示例圖

        

       上圖就是一個簡單的三層BP神經網絡。網絡共有6個單元,O0用於表示閾值,O1、O2為輸入層,O3、O4為第一隱層,也是唯一隱層,O5為輸出層單元。網絡接收兩個輸入 ,發送一個輸出 。每個單元接收一組輸入,發送一個輸出。 為權值,例如W40 表示O0與O4之間的權重。

     3)神經單元(計算單元)

        

           如上圖所示,每個圓表示一個神經單元。其接收一組數據,經過計算輸出一個數據。

     4)傳播過程

          a)正向傳遞

               例如:從O1-->O4-->05,這是正向傳遞過程中的一個路徑(O4除了接收O1,還接收O0、O2的輸入)。這里重點說下權重,W41表示O1和O4之間的權重,假如O1=1,O4=4,W41=0.5,那么O5=1*4*0.5=2(2不是最終輸出,最終輸出還需要加上O0、O2 的計算結果).

          b)反向傳遞(過程比較復雜,這個表述不是特別精確,只是為了方便理解)

              例如:從O1<--O4<--05,在這個過程中,O5是計算出的值,參與計算的O4的值不是其本身的值,而是在正向傳遞過程中計算出的值(即輸出值)。而權重也是這個過程中調整的。

 

2.MLPClassifier函數

       此函數是sklearn.neural_network中的函數,它是利用反向傳播誤差進行計算的多層感知器算法。

       a) 主要參數

               hidden_​​layer_sizes:隱藏層,例如:(5,2) 表示有2個隱藏層,第一隱藏層有5個神經單元,第二個隱藏層有2個神經單元;(5,2,4)表示有三個隱藏層。

               activation:激活函數,在反向傳遞中需要用到。有以下四個可選項:

                             'identity':無激活操作,有助於實現線性瓶頸, 返回 f(x) = x

                              'logistic':邏輯函數, 返回 f(x) = 1 / (1 + exp(-x)).

                               'tanh': 雙曲線函數, 返回 f(x) = tanh(x).

                               'relu': 矯正線性函數, 返回 f(x) = max(0, x),(默認)

              solver:反向傳播過程中采用的算法,有以下三個選項:

                         'lbfgs': 准牛頓算法.適用於較小數據集

                          'sgd': 隨機梯度下降算法.

                          'adam':優化的隨機梯度下降算法(默認)。適用於較大數據集

             alpha:L2懲罰系數

             learning_rate:學習速率,有以下幾個選項:(只有當slver='sgd'時有用)

                          constant:參數learning_rate_init指定的恆定學習速率.(默認選項)

                          invscaling’:使用“scale_t”的反向縮放指數逐漸降低每個時間步長t 的學習率effective_learning_rate = learning_rate_init / pow(t,power_t)(power_t是另外一個參數)

                          adaptive: 自適應,只要損失不斷下降就是用learning_rate_init。否則會自動調整(由另外一個參數tol決定)。

            learning_rate_init:初始學習速率

       b)屬性

          coefs_:權重列表

          n_layers_:神經網絡的總層數

3.示例一

          本示例使用的數據:機器學習:從編程的角度去理解邏輯回歸 。在下面的參數情況下正確率95%。

import numpy as np
import os
import pandas as pd
from sklearn.neural_network import MLPClassifier

def loadDataSet():
    ##運行腳本所在目錄
    base_dir=os.getcwd()
    ##記得添加header=None,否則會把第一行當作頭
    data=pd.read_table(base_dir+r"\lr.txt",header=None)
    ##dataLen行dataWid列 :返回值是dataLen=100 dataWid=3
    dataLen,dataWid = data.shape
    ##訓練數據集
    xList = []
    ##標簽數據集
    lables = []
    ##讀取數據
    for i in range(dataLen):
        row = data.values[i]
        xList.append(row[0:dataWid-1])
        lables.append(row[-1])
    return xList,lables


def GetResult():
    dataMat,labelMat=loadDataSet()
    clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
                        hidden_layer_sizes=(5,2), random_state=1)
    clf.fit(dataMat, labelMat)
    #print("層數----------------------")
    #print(clf.n_layers_)
    #print("權重----------------------")
    #for cf in clf.coefs_:
    #    print(cf)
    #print("預測值----------------------")
    y_pred=clf.predict(dataMat)
    m = len(y_pred)
    ##分錯4個
    t = 0
    f = 0
    for i in range(m):
        if y_pred[i] ==labelMat[i]:
            t += 1
        else :
            f += 1
    print("正確:"+str(t))
    print("錯誤:"+str(f))

if __name__=='__main__':
    GetResult()

4.示例二(數據來源)

   這次使用的數據還是紅酒。因為紅酒的口感得分是整數,所以也可以當作是分類。但是針對此實驗數據,在多次調整參數的過程中(主要是調整隱藏層)正確率最高只有61%。這正是BP神經網絡的一個缺陷:隱含層的選取缺乏理論的指導。

    代碼:

import numpy as np
import os
import pandas as pd
from sklearn.neural_network import MLPClassifier


##運行腳本所在目錄
base_dir=os.getcwd()
##記得添加header=None,否則會把第一行當作頭
data=pd.read_table(base_dir+r"\wine.txt",header=None,sep=';')
##dataLen行dataWid列 :返回值是dataLen=1599 dataWid=12
dataLen,dataWid = data.shape

##訓練數據集
xList = []
##標簽數據集
lables = []
##讀取數據
for i in range(dataLen):
    row = data.values[i]
    xList.append(row[0:dataWid-1])
    lables.append(row[-1])
##設置訓練函數
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
                        hidden_layer_sizes=(14,14,30), random_state=1)
##開始訓練數據
clf.fit(xList, lables) ##讀取預測值 y_pred
=clf.predict(xList) m = len(y_pred) t = 0 f = 0 ##預測結果分析 for i in range(m): if int(y_pred[i]) == lables[i]: t += 1 else : f += 1 print("正確:"+str(t)) print("錯誤:"+str(f))

 

5.BP神經網絡的缺點 

       1)容易形成局部極小值而得不到全局最優值。BP神經網絡中極小值比較多,所以很容易陷入局部極小值,這就要求對初始權值和閥值有要求,要使得初始權值和閥值隨機性足夠好,可以多次隨機來實現。
      2)訓練次數多使得學習效率低,收斂速度慢。
      3)隱含層的選取缺乏理論的指導。
      4)訓練時學習新樣本有遺忘舊樣本的趨勢。(可以把最優的權重記錄下來)

    

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM