1. 程式人生 > >BP神經網路的實現

BP神經網路的實現

一 BP神經網路的基本結構

這裡寫圖片描述

在神經網路中,輸入層由資料集的某個向量x和一個偏置b構成,該向量需要乘以同緯度的權重向量w,累加得到下一層神經元的一個輸入標量,該標量乘以啟用函式得到下一層神經元的輸入。

該結構分為以下幾個部分。
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

二 BP神經網路的訓練過程

1.正向傳播的過程
這裡寫圖片描述

上式中的w是隔層的權重向量。o是上一次的輸出向量,對於輸入層就是訓練樣本集x。b是閾值,與梯度下降法處理相同,在訓練樣本集x首列加入全為1的列向量。

加入列向量原始碼

    def addcol(self,matrix1,matrix2):
        [m1,n1] = shape(matrix1)
        [m2,n2] = shape(matrix2)
        if
m1 != m2: print "different rows,can not merge matrix" return; mergMat = zeros((m1,n1+n2)) mergMat[:,0:n1] = matrix1[:,0:n1] mergMat[:,n1:(n1+n2)] = matrix2[:,0:n2] return mergMat

啟用函式
這裡寫圖片描述
啟用函式原始碼

    def logistic(self,net):
        return
1.0/(1.0+exp(-net))

其中
這裡寫圖片描述
原始碼實現

hi_input = self.hi_wb*SampIn#隱含層節點輸入
hi_output = self.logistic(hi_input)#隱含層節點輸出
hi2out  = self.addcol(hi_output.T, ones((self.nSampNum,1))).T#加入全為1的列向量b
out_input = self.out_wb*hi2out#輸出層節點輸入
out_output = self.logistic(out_input)#輸出層節點輸出

2.計算期望和實際分類的誤差

計算實際輸出與期望的差,並判斷這個誤差是否低於容限。如果高於容限則進行反向傳播。
誤差向量:
這裡寫圖片描述


全域性誤差函式:
這裡寫圖片描述

3.計算反向傳播的過程
若正向傳播過程中未能得到期望值的輸出,則逐層計算實際輸出與期望值的誤差值,根據誤差值進行調節權重。

啟用函式的導函式dlogit函式
這裡寫圖片描述
dlogit程式碼實現

(1)輸出層誤差:計算誤差反向傳播層的梯度和微分,用於更新權重。
輸入層微分形式
這裡寫圖片描述
兩邊推導,其中左邊推導
這裡寫圖片描述
右邊推導
這裡寫圖片描述
將左右結合得到
這裡寫圖片描述

輸出層節點對最終的誤差需要負的責任為
這裡寫圖片描述

(2)隱含層誤差:計算誤差反向傳播的隱含層的梯度和微分,用於更新隱含層權重。
隱含層誤差:
這裡寫圖片描述
左右推導,其中左邊為
這裡寫圖片描述
右邊為
這裡寫圖片描述
左右結合在一起得到
這裡寫圖片描述

隱層節點對最終的誤差需要負的責任為
這裡寫圖片描述

4.修正各層權值
利用各層神經元的梯度和微分修正連線權值
更新輸出層
這裡寫圖片描述
更新隱含層
這裡寫圖片描述
其中N代表當前迭代次數,n是網路設計引數(如動量因子)

三 BP神經網路原始碼

# -*- coding: UTF-8 -*-

from numpy import *
import matplotlib.pyplot as plt 

class BPNet(object):
    def __init__(self):   
        self.eb = 0.01              # 誤差容限 
        self.eta = 0.1             # 學習率
        self.mc = 0.3               # 動量因子 
        self.maxiter = 2000         # 最大迭代次數
        self.errlist = []           # 誤差列表      
        self.dataMat = 0            # 訓練集
        self.classLabels = 0        # 分類標籤集
        self.nSampNum=0             # 樣本行數
        self.nSampDim=0             # 樣本列數
        self.nHidden = 4;           # 隱含層神經元 
        self.nOut = 1;              # 輸出層個數
        self.iterator =0            # 演算法收斂是迭代次數
    # 啟用函式
    def logistic(self,net):
        return 1.0/(1.0+exp(-net))

    # 啟用函式的導函式
    def dlogit(self,net):
        return multiply(net,(1.0-net))

    # 矩陣個元素平方和
    def errorfunc(self,inX):
        return sum(power(inX,2))*0.5

    # 資料標準化
    def normalize(self,dataMat):
        [m,n]=shape(dataMat)
        for i in xrange(n-1):
            dataMat[:,i] = (dataMat[:,i]-mean(dataMat[:,i]))/(std(dataMat[:,i])+1.0e-10)
        return dataMat

    #載入資料
    def loadDataSet(self,filename):
        self.dataMat = []; self.classLabels = []
        fr = open(filename)
        for line in fr.readlines():
            lineArr = line.strip().split()
            self.dataMat.append([float(lineArr[0]), float(lineArr[1]), 1.0])
            self.classLabels.append(int(lineArr[2]))
        self.dataMat = mat(self.dataMat)
        m,n = shape(self.dataMat)
        self.nSampNum = m;    
        self.nSampDim = n-1; 
    # 增加新增列         
    def addcol(self,matrix1,matrix2):
        [m1,n1] = shape(matrix1)
        [m2,n2] = shape(matrix2)
        if m1 != m2:
            print "different rows,can not merge matrix"
            return;     
        mergMat = zeros((m1,n1+n2))
        mergMat[:,0:n1] = matrix1[:,0:n1]
        mergMat[:,n1:(n1+n2)] = matrix2[:,0:n2]
        return mergMat      

    # 隱含層初始化
    def init_hiddenWB(self):
        self.hi_w = 2.0*(random.rand(self.nHidden,self.nSampDim)-0.5)
        self.hi_b = 2.0*(random.rand(self.nHidden,1)-0.5)
        self.hi_wb = mat(self.addcol(mat(self.hi_w),mat(self.hi_b)))
    # 輸出層初始化
    def init_OutputWB(self):
        self.out_w = 2.0*(random.rand(self.nOut,self.nHidden)-0.5)
        self.out_b = 2.0*(random.rand(self.nOut,1)-0.5)
        self.out_wb = mat(self.addcol(mat(self.out_w),mat(self.out_b)))

    # bp網路主程式
    def bpTrain(self):
        SampIn = self.dataMat.T
        expected = mat(self.classLabels)
        self.init_hiddenWB()
        self.init_OutputWB()
        dout_wbOld = 0.0 ; dhi_wbOld = 0.0 

        for i in xrange(self.maxiter):   
            #正向傳播
            hi_input = self.hi_wb*SampIn#隱含層節點輸入
            hi_output = self.logistic(hi_input)#隱含層節點輸出
            hi2out  = self.addcol(hi_output.T, ones((self.nSampNum,1))).T#加入全為1的列向量b
            out_input = self.out_wb*hi2out#輸出層節點輸入
            out_output = self.logistic(out_input)#輸出層節點輸出

            #2.誤差計算  
            err = expected - out_output 
            sse = self.errorfunc(err)
            self.errlist.append(sse);
            if sse <= self.eb:
                self.iterator = i+1
                break;

            #3.反向傳播
            DELTA = multiply(err,self.dlogit(out_output))
            delta =multiply(self.out_wb[:,:-1].T*DELTA,self.dlogit(hi_output)) 
            dout_wb = DELTA*hi2out.T
            dhi_wb = delta*SampIn.T

            if i == 0:
                self.out_wb = self.out_wb + self.eta * dout_wb 
                self.hi_wb = self.hi_wb + self.eta * dhi_wb
            else :
                self.out_wb = self.out_wb + (1.0 - self.mc)*self.eta*dout_wb  + self.mc * dout_wbOld
                self.hi_wb = self.hi_wb + (1.0 - self.mc)*self.eta*dhi_wb + self.mc * dhi_wbOld
            dout_wbOld = dout_wb
            dhi_wbOld = dhi_wb

    # bp網路分類器
    def BPClassfier(self,start,end,steps=30):
        x = linspace(start,end,steps)
        xx = mat(ones((steps,steps)))
        xx[:,0:steps] = x 
        yy = xx.T
        z = ones((len(xx),len(yy))) ;
        for i in xrange(len(xx)):
            for j in xrange(len(yy)):
                xi = []; tauex=[] ; tautemp=[]
                mat(xi.append([xx[i,j],yy[i,j],1])) 
                hi_input = self.hi_wb*(mat(xi).T)
                hi_out = self.logistic(hi_input) 
                taumrow,taucol= shape(hi_out)
                tauex = mat(ones((1,taumrow+1)))
                tauex[:,0:taumrow] = (hi_out.T)[:,0:taumrow]
                out_input = self.out_wb*(mat(tauex).T)
                out = self.logistic(out_input) 
                z[i,j] = out 
        return x,z

# 繪製分類器
    def classfyLine(self,plt,x,z):
        plt.contour(x,x,z,1,colors='black')

# 繪製誤差曲線    
    def TrendLine(self,plt,color='r'):
        X = linspace(0,self.maxiter,self.maxiter)
        Y = log2(self.errlist)      
        plt.plot(X,Y,color)

    # 資料散點圖
    def drawClassScatter(self,plt):
        i=0
        for mydata in self.dataMat:
            if self.classLabels[i]==0:
                plt.scatter(mydata[0,0],mydata[0,1],c='blue',marker='o')
            else:
                plt.scatter(mydata[0,0],mydata[0,1],c='red',marker='s')
            i += 1      

主程式原始碼

from numpy import *
import operator
from bpNet import *
import matplotlib.pyplot as plt 

# 資料集
bpnet = BPNet() 
bpnet.loadDataSet("testSet2.txt")
bpnet.dataMat = bpnet.normalize(bpnet.dataMat)

# 繪製資料集散點圖
bpnet.drawClassScatter(plt)

# BP神經網路進行資料分類
bpnet.bpTrain()

print bpnet.out_wb
print bpnet.hi_wb

# 計算和繪製分類線
x,z = bpnet.BPClassfier(-3.0,3.0)
bpnet.classfyLine(plt,x,z)
plt.show()
# 繪製誤差曲線
bpnet.TrendLine(plt)
plt.show()

四 執行結果

這裡寫圖片描述

相關推薦

BP神經網路實現分類問題(python)

一些程式碼解釋 python版本:3.6 梯度更新 下面的程式碼 是對輸出層和隱層的梯度計算,具體可參考周志華機器學習103頁梯度更新公式 for i in range(self.outputn):#計算輸出層的梯度 y=

matlab+BP神經網路實現手寫體數字識別

個人部落格文章連結:http://www.huqj.top/article?id=168 接著上一篇所說的 BP神經網路,現在用它來實現一個手寫體數字的識別程式,訓練素材來自吳恩達機器學習課程,我把打包好上傳到了網盤上: 1 2 連結:htt

python手寫bp神經網路實現人臉性別識別1.0

寫在前面:本實驗用到的圖片均來自google圖片,侵刪! 實驗介紹 用python手寫一個簡單bp神經網路,實現人臉的性別識別。由於本人的機器配置比較差,所以無法使用網上很紅的人臉大資料資料集(如lfw資料集等等),所以我從google圖片下載了一些

Python BP神經網路實現

Python_BP神經網路實現(向量化運算、鳶尾花分類測試) 簡介 人工神經網路模型種類很多,其中根據網路內資料流向進行分類可以分為前饋網路、反饋網路和自組織網路。 通過對Andrew Ng的深度學習課程的學習,本文總結其中淺層神經網路一章的知識點

利用BP神經網路實現手寫字元識別

利用python實現的BP神經網路,進行手寫字元識別,訓練與測試資料集為mnist,若實現UI介面需要安裝pyqt5。程式碼開源在個人的github:https://github.com/SpyderXu/BP_mnist_UI效果:

BP神經網路基於Tensorflow的實現(程式碼註釋詳細)

BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。 在一般的BP神經網路中,單個樣本有m個輸入和n個輸出,在輸入層

神經網路學習(3)————BP神經網路以及python實現

一、BP神經網路結構模型                BP演算法的基本思想是,學習過程由訊號的正向傳播和誤差的反向傳播倆個過程組成,輸入從輸入層輸入,經隱層處理以後,傳向輸出層。如果輸出層的實際輸出和期望輸出不符合

單隱層BP神經網路C++實現

    這幾天抽時間學習了一下很久之前就想學習的BP神經網路。通過閱讀西瓜書的神經網路部分的原理和參考了網上幾篇部落格,我自己用C++編寫、實現了一個單隱層BP神經網路。     簡單畫了個示意圖,好理解下面給出的公式:(注意:圖中省略了其他的節點之間的連

Tensorflow實現BP神經網路

Tensorflow實現BP神經網路 摘要:深度學習中基本模型為BP深度神經網路,其包括輸入層、隱含層和輸出層。輸入層的神經元個數取決於資料集屬性特徵的個數,輸出層神經元個數取決於劃分類標的個數。BP神經網路通過梯度下降法不斷調整權重矩陣和偏向進行調參,實現神經網路的訓練。   本人

keras實現網路流量分類功能的BP神經網路

資料集選用KDD99 資料下載地址:http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html 需求:https://blog.csdn.net/com_stu_zhang/article/details/6987632

python的神經網路實現BP神經網路

在這裡插入程式碼片# -*- coding: utf-8 -*- """ Created on Sun Oct 14 10:41:33 2018 @author: fang """ # -*- coding:utf-8 -*- #! python2 impo

機器學習之BP神經網路演算法實現影象分類

BP 演算法是一個迭代演算法,它的基本思想為:(1) 先計算每一層的狀態和啟用值,直到最後一層(即訊號是前向傳播的);(2) 計算每一層的誤差,誤差的計算過程是從最後一層向前推進的(這就是反向傳播演算法名字的由來);(3) 更新引數(目標是誤差變小),迭代前面兩

[純C#實現]基於BP神經網路的中文手寫識別演算法

效果展示 這不是OCR,有些人可能會覺得這東西會和OCR一樣,直接進行整個字的識別就行,然而並不是. OCR是2維畫素矩陣的畫素資料.而手寫識別不一樣,手寫可以把使用者寫字的筆畫時間順序,抽象成一個維度.這樣識別的就是3維的資料了.識別起來簡單很多. 最近需要做一箇中文手寫識別演算法.搜尋了網上的

BP神經網路與MATLAB實現案例一

眾做周知,BP神經網路是最常用的一種神經網路。 本文主要講解%實現對玫瑰的識別%案例。 關於神經網路的介紹與BP的詳解,論壇裡鋪天蓋地,不在此贅述。 一.BP簡述 簡要概括一下: 一

130行程式碼實現BP神經網路原理及應用舉例

    優化演算法是機器學習的一個重要組成部分,BP神經網路是深度學習的基礎,BP神經網路原理非常簡單,幾乎可以理解作是logistic迴歸的一種集合方式,在前面的博文中,筆者利用R語言實現了幾種優化演算法,本文以前面提到的粒子群演算法為工具,以神經網路的原理為基礎,實現了

簡單BP神經網路的python實現

貼上一個前兩天寫的不用框架實現隨機梯度下降的GitHub連結吧,具體說明可以看裡面的文件。============================18.6.3 update=======================================儘管神經網路已經有了很完備

Bp神經網路+C++實現

0 前言   神經網路在我印象中一直比較神祕,正好最近學習了神經網路,特別是對Bp神經網路有了比較深入的瞭解,因此,總結以下心得,希望對後來者有所幫助。   神經網路在機器學習中應用比較廣泛,比如函式逼近,模式識別,分類,資料壓縮,資料探勘等領域。神經

BP神經網路學習及matlab實現

什麼是神經網路? 神經網路是由很多神經元組成的,首先我們看一下,什麼是神經元 上面這個圖表示的就是一個神經元,我們不管其它書上說的那些什麼樹突,軸突的。我用個比較粗淺的解釋,可能不太全面科學,但對初學者很容易理解: 1、我們把輸入訊號看成你在matlab中需要輸入的資料,

機器學習與神經網路(四):BP神經網路的介紹和Python程式碼實現

前言:本篇博文主要介紹BP神經網路的相關知識,採用理論+程式碼實踐的方式,進行BP神經網路的學習。本文首先介紹BP神經網路的模型,然後介紹BP學習演算法,推導相關的數學公式,最後通過Python程式碼實現BP演算法,從而給讀者一個更加直觀的認識。 1.BP網路模型 為了將理

BP神經網路python簡單實現

BP神經網路的原理在網上有很詳細的說明,這裡就不打算細說,這篇文章主要簡單的方式設計及實現BP神經網路,並簡單測試下在恆等計算(編碼)作測試。  BP神經網路模型圖如下 BP神經網路基本思想 BP神經網路學習過程由資訊的下向傳遞和誤差的反向傳播兩個過程組成 正向傳遞:由