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

BP神經網路 c++實現

這裡寫圖片描述


#include <iostream>
#include <cmath>
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
using namespace std;

#define  innode 8       //輸入結點數
#define  hidenode 4     //隱含結點數
#define  outnode 8      //輸出結點數
#define  trainsample 8  //BP訓練樣本數

class BpNet
{
public:
    void train(double p[trainsample][innode], double
t[trainsample][outnode]);//Bp訓練 double p[trainsample][innode]; //輸入的樣本 double t[trainsample][outnode]; //樣本要輸出的 double *recognize(double *p); //Bp識別 BpNet(); virtual ~BpNet(); public: void init(); double w[innode][hidenode]; //隱含結點權值 double w1[hidenode][outnode]; //輸出結點權值
double b1[hidenode]; //隱含結點閥值 double b2[outnode]; //輸出結點閥值 double rate_w; //權值學習率(輸入層-隱含層) double rate_w1; //權值學習率 (隱含層-輸出層) double rate_b1; //隱含層閥值學習率 double rate_b2; //輸出層閥值學習率 double e; //誤差計算 double error; //允許的最大誤差 double
result[outnode]; // Bp輸出 }; BpNet::BpNet() { error=1.0; e=0.0; rate_w = 0.1; //權值學習率(輸入層--隱含層) rate_w1 = 0.1; //權值學習率 (隱含層--輸出層) rate_b1 = 0.1; //隱含層閥值學習率 rate_b2 = 0.1; //輸出層閥值學習率 } BpNet::~BpNet() { } //產生[low, high)之間的隨機數 double randval(double low, double high) { double val; val = ((double)(rand() % RAND_MAX)/(double)RAND_MAX) * (high - low) + low; return(val); } void winit(double w[], int n) //權值初始化 { for(int i=0; i<n; i++) w[i] = randval(-0.01, 0.01); } //初始化 void BpNet::init() { winit((double*)w, innode * hidenode); winit((double*)w1, hidenode * outnode); winit(b1, hidenode); winit(b2, outnode); } //訓練 void BpNet::train(double p[trainsample][innode], double t[trainsample][outnode]) { double pp[hidenode]; //隱含結點的校正誤差 double qq[outnode]; //希望輸出值與實際輸出值的偏差 double yd[outnode]; //希望輸出值 double x[innode]; //輸入向量 double x1[hidenode]; //隱含結點狀態值 double x2[outnode]; //輸出結點狀態值 double o1[hidenode]; //隱含層啟用值 double o2[hidenode]; //輸出層啟用值 for(int isamp=0; isamp<trainsample; isamp++) //迴圈訓練一次樣品 { int i, j, k; for(i=0; i<innode; i++) x[i] = p[isamp][i]; //輸入的樣本 for(i=0; i<outnode; i++) yd[i] = t[isamp][i]; //希望輸出的樣本 //正向傳播 //構造每個樣品的輸入和輸出標準 for(j=0; j<hidenode; j++) { o1[j] = 0.0; for(i=0; i< innode; i++) o1[j] += w[i][j] * x[i]; //隱含層各單元輸入啟用值 x1[j] = 1.0 / (1.0 + exp(-o1[j] - b1[j])); //隱含層各單元的輸出 } for(k=0; k<outnode; k++) { o2[k] = 0.0; for(int j=0; j<hidenode; j++) o2[k] += w1[j][k] * x1[j]; //輸出層各單元輸入啟用值 x2[k] = 1.0 / (1.0 + exp(-o2[k] - b2[k])); //輸出層各單元輸出 } //誤差反向傳播 for(k=0; k<outnode; k++) //對於網路中每個輸出單元,計算誤差項,並更新權值 { qq[k] = (yd[k] - x2[k]) * x2[k] * (1-x2[k]); //希望輸出與實際輸出的偏差 for(j=0; j<hidenode; j++) w1[j][k] += rate_w1 * qq[k] * x1[j]; //更新隱含層和輸出層之間的連線權 } for(j=0; j<hidenode; j++) //對於網路中每個隱藏單元,計算誤差項,並更新權值 { pp[j] = 0.0; for(k=0; k<outnode; k++) pp[j] += qq[k] * w1[j][k]; pp[j] = pp[j] * x1[j] * (1 - x1[j]); //隱含層的校正誤差 for(i=0; i<innode; i++) w[i][j] += rate_w * pp[j] * x[i]; //更新輸入層和隱含層之間的連線權 } for(k=0; k<outnode; k++) { e += pow(yd[k] - x2[k], 2); //計算均方差 } error = e/2.0; for(k=0; k<outnode; k++) b2[k] += rate_b2 * qq[k]; //更新隱含層和輸出層之間的閾值 for(j=0; j<hidenode; j++) b1[j] += rate_b1 * pp[j]; //更新輸入層和隱含層之間的閾值 } } //識別 double *BpNet::recognize(double *p) { double x[innode]; //輸入向量 double x1[hidenode]; //隱含結點狀態值 double x2[outnode]; //輸出結點狀態值 double o1[hidenode]; //隱含層啟用值 double o2[hidenode]; //輸出層啟用值 int i, j, k; for(i=0; i<innode; i++) x[i] = p[i]; for(j=0; j<hidenode; j++) { o1[j] = 0.0; for(i=0; i<innode; i++) o1[j] = o1[j] + w[i][j] * x[i]; //隱含層各單元啟用值 x1[j] = 1.0 / (1.0 + exp(-o1[j] - b1[j])); //隱含層各單元輸出 } for(k=0; k<outnode; k++) { o2[k] = 0.0; for(j=0; j<hidenode; j++) o2[k] = o2[k] + w1[j][k] * x1[j]; //輸出層各單元啟用值 x2[k] = 1.0 / (1.0 + exp(-o2[k] - b2[k])); //輸出層各單元輸出 } for(k=0; k<outnode; k++) { result[k] = x2[k]; } return result; } //輸入樣本 double X[trainsample][innode] = { {1,0,0,0,0,0,0,0}, {0,1,0,0,0,0,0,0}, {0,0,1,0,0,0,0,0}, {0,0,0,1,0,0,0,0}, {0,0,0,0,1,0,0,0}, {0,0,0,0,0,1,0,0}, {0,0,0,0,0,0,1,0}, {0,0,0,0,0,0,0,1} }; int main() { srand(time(NULL)); int i, j, k; BpNet bp; bp.init(); int times = 0; while(bp.error > 0.0001 && times < 5000) { bp.e = 0.0; times++; bp.train(X, X); } double m[innode] = {0,0,1,0,0,0,0,0}; bp.recognize(m); for(i=0; i<innode; ++i) cout << m[i]; cout << " is "; for(i=0; i<outnode; i++) printf("%d", (int)floor(bp.result[i] + 0.5)); cout << endl; return 0; }

這裡寫圖片描述

當將隱藏結點數設定為:13,可以識別任意2個位置為1的二進位制數
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

相關推薦

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

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

Bp神經網路+C++實現

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

BP神經網路 c++實現

#include <iostream> #include <cmath> #include "stdio.h" #include "stdlib.h" #include "time.h" using namespace std;

BP神經網路-- C語言實現

在上一篇文章中,介紹了BP神經網路的基本模型、模型中的一些術語並對模型進行了數學上的分析,對它的原理有了初步的認識。那麼如何用程式語言來具體的實現它,將是我們下一步需要討論的問題。本文選取的是C語言來實現一個簡單的單隱藏層的BP神經網路(預設大家瞭解了BP神經網路的基本

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

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

MATLAB神經網路程式設計(七)——BP神經網路實現

《MATLAB神經網路程式設計》 化學工業出版社 讀書筆記 第四章 前向型神經網路 4.3 BP傳播網路 本文是《MATLAB神經網路程式設計》書籍的閱讀筆記,其中涉及的原始碼、公式、原理都來自此書,若有不理解之處請參閱原書 本文講述BP網路常

Java實現BP神經網路實現對空氣質量的分析和評級

使用java實現BP神經網路進行迴歸分析,並利用訓練好的神經網路實現空氣質量的評級。 本實驗的工程專案和訓練資料集可訪問以下網址下載: 實驗描述: 對指定資料集進行迴歸分析,選擇適當的迴歸演算法,編寫程式實現,提交程式和結果報告。 資料集: AirQualityU

BP神經網路實現

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

BP神經網路java實現,按照演算法步驟也參考網上相關資源寫的,若君有高見,非常歡迎指教

for(int i=0;i<hidN;i++){for(int j=0;j<=inN;j++){wyh[i][j]=Math.random()-0.5;//初始化權值和閾值//System.out.println(wyh[i][j]);}}//System.out.println();wyo=ne

BP神經網路Python實現異或問題

# -*- coding: UTF-8 -*- import matplotlib as mpl import numpy as np import matplotlib.pyplot as plt #BP神經網路實現異或問題 X=np.array([[1,0,0]

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

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

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

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

C++實現誤差反向傳播演算法(BP神經網路

誤差反向傳播學習演算法 實現Iris資料分類 Denverg Secret Number 29,April 2018 實驗目的 用C++實現BP神經網路 實驗原理 人工神經網路模型 人們從40年代開始研究人腦神經元功能。1943年

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

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

C++實現的簡單BP神經網路

實現了一個簡單的BP神經網路演算法 使用EasyX圖形化顯示訓練過程和訓練結果 使用了25個數據集,一共訓練了1萬次。 該神經網路有兩個輸入,一個輸出端 下圖是訓練效果,data是訓練的輸入資料,temp代表所在層的輸出,target是訓練目標,右邊的大

C# + Matlab 實現計件工時基於三層BP神經網路的擬合--真實專案

  工序工時由該工序的工藝引數決定,有了工時後乘以固定因子就是計件工資。一般參考本地小時工資以及同類小時工資並考慮作業的風險等因素給出固定因子 採用的VS2010 , Matlab2015a 64,  開發端是win7 64 , 部署端是win2012 R2 Datacenter 64 M

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

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

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

一、BP神經網路結構模型                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