1. 程式人生 > >BP神經網路原理分析及c++程式碼實現(上)

BP神經網路原理分析及c++程式碼實現(上)

    本部落格所述BP神經網路,是本人研究總結的結果,希望對您有所幫助,當然,如果有需要,大家可以互相交流。

   設計一個BP神經網路類,來實現一個BP神經網路。要求輸入層節點數、隱層數、隱層節點數、輸出層節點數、傳遞函式、演算法等等可以由使用者自主設定。

神經網路的基本原理

BPBack Propagation)網路是1986年由RumelhartMcCelland為首的科學家小組提出,是一種按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一。BP網路能學習和存貯大量的輸入-輸出模式對映關係,而無需事前揭示描述這種對映關係的數學方程。它的學習規則是使用最速下降法,通過反向傳播來不斷調整網路的權值和閾值,使網路的誤差平方和最小。BP

神經網路模型拓撲結構包括輸入層(input)、隱層(hide layer)和輸出層(output layer)

神經元模型

3-1人工神經元的基本構成單元

3-1 給出了一個具有n個輸入的基本BP神經元模型結構。圖中每一個輸入被賦予一定的權值,求和後形成神經元傳遞函式的輸入。

啟用函式的作用是對該神經元所獲得的網路輸入進行變換,也可以稱為激勵函式或活化函式,如圖(3-1)所示。BP網路屬於多層網路,其常用的傳遞函式有線性函式(purelin)和sigmoid型函式。

1、線性函式(purelin

abd為常數。它的飽和值為aa + b

函式的飽和值為01S形函式有較好的增益控制性能,如果BP

網路輸出層採用sigmoid型傳遞函式,那麼網路的輸出值就限制在[ a , a + b ]之間,根據實際需要,通常將輸出值限制在[ -1 , 1 ]之間,而如果將線性函式purelin作為輸出層的傳遞函式,那麼輸出值可為任意值。因此在隱層中常常採用sigmoid函式進行中間結果的傳遞,而在最後的輸出層則用線性傳遞函式對輸出值進行值域擴張。

3.2 BP神經網路結構

圖3-4顯示了一個具有n個輸入,m個輸出的BP神經網路結構。

圖3-4 BP神經網路結的拓撲結構

訊號只被允許從較低層流向較高層。

層號表示層的高低:層號較小者,層次較低,層號較大者,層次較高。

輸入層:被記作第0層。該層負責接收來自網路外部的資訊

j層:第j-1層的直接後繼層(j>0),它直接接受第j-1層的輸出。

輸出層:它是網路的最後一層,具有該網路的最大層號,負責輸出網路的計算結果。

隱藏層:除輸入層和輸出層以外的其它各層均叫隱藏層。隱藏層不直接接受外界的訊號,也不直接向外界傳送訊號

約定 :

輸出層的層號為該網路的層數:n層網路或n級網路。

j-1層到第j層的聯接矩陣為第j層聯接矩陣,輸出層對應的矩陣叫輸出層聯接矩陣。今後我們在需要的時候一般用表示第j層矩陣。

前向型神經網路通常具有一個或多個由sigmoid神經元構成的隱層,和一個由線性神經元構成的輸出層。多個具有非線性傳遞函式的神經元層使得網路可以學習輸入和輸出之間的非線性關係,而線性輸出層則使網路可以產生區間[ -1 , 1 ]之外的值。

如果需要對網路輸出的值域加以限制,例如想要將網路輸出值限制在[ 0 , 1 ]以內,那麼輸出層就應該採用sigmoid型函式。

3.3 BP網路學習規則

BP網路的學習是有監督的學習,訓練過程中需要提供輸入向量P和輸出向量T,根據網路誤差效能對網路權值和偏差進行調整,最終實現期望的功能。前向型神經網路仍然採用均方誤差作為預設的網路效能函式,網路學習的過程就是使均方誤差最小化的過程。BP學習規則是使用不同的演算法來實現網路均方誤差的最小化,本文主要闡述五種演算法:基本的BP演算法(traingd增加動量項的BP演算法(traingdm)帶動量及自適應學習速率的BP演算法(traingdx)共軛梯度演算法(traincgf)彈性梯度演算法(trainrp)。文件中所有的傳遞函式預設為sigmoid型,但purelin型相對比較簡單,因此使用者可參照本文自行推理。

3.3.1基本的BP演算法(traingd)

基本的BP演算法,是最簡單的BP演算法,也是最基礎的BP演算法。我們知道函式的梯度方向是函式值增加最快的方向,那麼負梯度方向便是函式值減小最快的方向,基本的BP演算法就是沿著負梯度方向通過調整權值來減小均方誤差的,其他的演算法基本都是在BP演算法的基礎上進行改進的。

用輸出層的誤差來調整輸出層的權矩陣,並估計輸出層的直接前導層的誤差,然後再用輸出層的前導層誤差估計更前一層的誤差,如此獲得了所有其它各層的誤差估計。用這些估計實現對權矩陣的修改,形成將輸出端表現出的誤差沿著與輸入訊號相反的方向逐級向輸入端傳遞的過程。這個過程的具體實現如下文所述。

(一)神經元的輸入輸出

神經元的網路輸入:

根據圖(3-1)和式3-4,任意神經元的輸入可表示為

圖3-5 傳遞函式(3-10)

(二)訓練過程概述

樣本:(輸入向量,理想輸出向量)

權初始化:小隨機數與飽和狀態。

Step1, 向前傳播階段:

1)從樣本集中取一個樣本,將輸入網路;

2)計算相應的實際輸出:

如果將學習速率設定為可變的,那麼就可以改變學習演算法的效能。具備自適應學習速率的梯度下降演算法可以在保持訓練過程穩定的前提下采用最大的步長。

本程式中採用的方法是通過比較相鄰兩次迭代之間的誤差平方和的大小,來判斷學習速率是增加還是減少。

  

3.3.5彈性梯度演算法(trainrp)

該演算法是在traingdx演算法的基礎上實現的,也是對BP演算法的進一步改進。多層神經網路通常在隱層中採用sigmoid型傳遞函式。由於sigmoid函式的作用是將無限的輸入範圍壓縮到一個有限的輸出範圍內,因此它們都有這樣一個特性,即輸入樣本變數非常大的時候,函式曲線斜率將會逐漸接近於零。這可能造成的一個問題,即如果採用該演算法進行訓練,梯度值有可能會很小,這樣每一次迭代的權值和偏差的該變數會很小,儘管它們距離最優值還有很遠的距離。

有彈性的BP訓練演算法的目標就是消除由於誤差函式偏微分的數值上變動所造成的不利於訓練的效應。這種演算法只通過偏微分函式符號決定權值的變化方向,而忽略偏微分數值的大小,權值的變化量則由一個獨自更新的數值來決定。

如果在連續兩次迭代中誤差效能函式對某一權值的偏導數的正負號相同,則權值更新值會增大,而如果連續兩次迭代中誤差效能函式對某一權值的偏導數正負號不同,則權值更新值會減小,如果偏導數等於0,則迭代停止。這樣,權值的變動過程是一個幅度逐漸減小的震盪過程,最後收斂到梯度為0的目標點。

4 BP神經網路類的實現

4.1概述

該類是基於BP神經網路的原理,利用c/c++語言在vs2005上實現的一個BP神經網路類,該類當中引數的命名、定義等都是參照matlab當中的神經網路工具箱來實現的。該BP神經網路的輸入層節點數、隱層數、隱層節點數、輸出層節點數、傳遞函式、演算法等均可以由使用者自主設定,並且給出通用的介面,方便使用者使用。

該類的實現是通過網路構造網路訓練網路應用三個模組實現的。網路構造模組的主要功能是建立一個BP神經網路;網路訓練模組的主要功能是根據輸入的訓練資料,通過訓練調整權值,最終輸出一個需要的網路;應用模組的主要功能是提供方便使用者使用的藉口。網路實現的流程圖如圖4-1所示。

相關推薦

BP神經網路原理分析c++程式碼實現

    本部落格所述BP神經網路,是本人研究總結的結果,希望對您有所幫助,當然,如果有需要,大家可以互相交流。    設計一個BP神經網路類,來實現一個BP神經網路。要求輸入層節點數、隱層數、隱層節點數、輸出層節點數、傳遞函式、演算法等等可以由使用者自主設定。 神經網路

BP神經網路原理分析c++程式碼實現

為了方便廣大使用者的使用,本人將BP神經網路寫成了一個BPNNS類,這樣使用者們可以很方便的將此類潛入到自己的工程當中,此類的具體的使用規則,下面會介紹。 /*********************************************************

隨機森林的原理分析Python程式碼實現

轉載地址:https://blog.csdn.net/flying_sfeng/article/details/64133822/在講隨機森林前,我先講一下什麼是整合學習。整合學習通過構建並結合多個分類器來完成學習任務。整合學習通過將多個學習器進行結合,常可獲得比單一學習器更

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

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

基於Huffman樹的檔案壓縮原理C語言實現

在上文基於Huffman樹的檔案壓縮原理及C語言實現(一)中已經介紹並實現瞭如何建立Huffman樹,得到Huffman編碼,這篇我們將會接著說。如何通過Huffman樹,實現檔案壓縮。 實現思路 任何檔案都可以看作是由位元組組成的位元組塊,將位元組看作

bp神經網絡模型推導與c語言實現轉載

思路 包括 表示 現在 clas 兩個 通過 val c++ 轉載出處:http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html BP 神經網絡中的 BP 為 Back Propagation

紅黑樹增刪操作的程式碼實現

這幾天一直在學習紅黑樹,由於是第一次接觸,所以剛開始覺得挺麻煩的,經過這幾天的各種google,終於對其的插入和刪除操作有了一定了解,現在就分享下: 紅黑樹的定義:紅黑樹是每個節點都帶有顏色屬性的二叉查詢樹,顏色為紅色或黑色。在二叉查詢樹強制一般要求以外,對於任何有效的紅黑

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

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

BP神經網路原理matlab例項

轉載:http://blog.csdn.net/u013007900/article/details/50118945 上一次我們講了M-P模型,它實際上就是對單個神經元的一種建模,還不足以模擬人腦神經系統的功能。由這些人工神經元構建出來的網路,才能夠具有學

引導濾波原理C++程式碼實現

前置內容 在學習引導濾波,最好對高斯濾波和雙邊濾波有過理解,對於高斯濾波: W i

結構體中指標賦值問題的分析C程式碼示例

問題描述 某結構體的定義如下: typedef struct { int iAge; // 年齡 char szAddr1[100]; // 地址1 char *psz

BP神經網路原理與matlab實現

個人部落格文章連結: http://www.huqj.top/article?id=166 BP神經網路,即“反向傳播”神經網路,是一種被廣泛運用的人工神經網路,它的思想就是通過反向傳播不斷調整模型權重,最終使得模型輸出與預期輸出的誤差控制在一個小範圍內。其中反向傳播的演算法(BP演算

BP神經網路原理推導

本文會完成BP神經網路的推導過程,先介紹BP神經網路的歷史,然後介紹BP神經網路的結構,然後再開始推導,最後介紹BP神經網路的優缺點以及幾個優化的方法。 目錄 1 BP神經網路的歷史 2 BP神經網路的結構 2.1 神經元 2.2 輸入層 2.3 隱含層 2.4 輸出層

影象去霧之何凱明暗通道先驗去霧演算法原理c++程式碼實現

http://blog.csdn.net/s12244315/article/details/50292049 何凱明博士,2007年清華大學畢業,2011年香港中文大學博士畢業,可謂是功力深厚,感嘆於國內一些所謂博士的水平,何這樣的博士才可以真正叫做

[技術棧]CRC校驗原理C#程式碼實現CRC16、CRC32計算FCS校驗碼

1.CRC、FCS是什麼 CRC,全稱Cyclic Redundancy Check,中文名稱為迴圈冗餘校驗,是一種根據網路資料包或計算機檔案等資料產生簡短固定位數校驗碼的一種通道編碼技術,主要用來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。 FCS,全稱Frame C

spring之mvc原理分析簡單模擬實現

subst request 配置文件 location dap tro build classes getname   在之前的一篇博客中已經簡單的實現了spring的IOC和DI功能,本文將在之前的基礎上實現mvc功能。 一 什麽是MVC   MVC簡單的說就是一種軟件實

找出陣列中第k大的數時間複雜度分析C++程式碼實現. TopK in array. ( leetcode

找出陣列中第k大的數. TopK in array. ( leetcode - 215 ) 最近面試過程中遇到的一個題目,也是大資料時代常見的題目,就來總結一下。 面試題目: 1、10億數中,找出最大的100個數。用你能想到的最優的時間和空間效率。 2

【java併發程式設計】執行緒池原理分析ThreadPoolExecutor原始碼實現

執行緒池簡介:  多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。         假設一個伺服器完成一項任務所需時間為:T1 建立執行緒時間,T2 線上程中執行任務的時間,T3 銷燬執行緒時間。    

執行緒池淺析C++程式碼實現

(1)什麼是執行緒池  執行緒池是一種多執行緒處理技術。執行緒池先建立好若干執行緒,並管理這些執行緒。當有新的任務到來時,將任務新增到一個已建立的空閒執行緒中執行。執行緒池所建立的執行緒優先順序都是一樣的,所以需要使用特定執行緒優先順序的任務不宜使用執行緒池。   (2)

選擇排序原理分析與java程式碼實現

1、選擇排序改進了氣泡排序,將必要的交換次數從 O(N^2 )減少到 O(N)次(理解選擇排序可以先看一下我的上一篇氣泡排序的部落格)不幸的是比較次數仍然保持為 O(N^2 )。然而,選擇排序仍然為大記錄量的排序提出了一個非常重要的改進,因為這些大量的記錄需要在記憶體中移動,