1. 程式人生 > >BP神經網路之鳶尾花

BP神經網路之鳶尾花

1 #include <stdio.h> 2 #include <math.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <string> 6 #include <fstream> 7 #include <iomanip> 8 9 #define innode 4//輸入層結點數 10 #define hidenode 10//隱層結點數 11 #define outnode 3//輸出層結點數 12 #define trainsample 75//
訓練樣本數 13 #define testsample 75//測試樣本數 14 15 double trainData[trainsample][innode];//輸入樣本 16 double outData[trainsample][outnode];//輸出樣本 17 18 double testData[testsample][innode];//測試樣本 19 20 double w[innode][hidenode];//輸入層到隱層的權值 21 double w1[hidenode][outnode];//隱層到輸出層的權值 22 double b1[hidenode];//隱層閾值
23 double b2[outnode];//輸出層閾值 24 25 double e=0.0;//誤差計算 26 double error=1.0;//允許的最大誤差 27 28 double rate_w=0.9;//輸入層到隱層的學習率 29 double rate_w1=0.9;//隱層到輸出層的學習率 30 double rate_b1=0.9;//隱層閾值學習率 31 double rate_b2=0.9;//輸出層閾值學習率 32 33 double result[outnode];//bp輸出 34 35 //初始化函式 36 void init(double w[], int n); 37
//Bp訓練函式 38 void train(double trainData[trainsample][innode], double label[trainsample][outnode]); 39 //Bp識別 40 double *recognize(double *p); 41 //從資料夾讀取資料 42 void readData(std::string filename, double data[][innode], int x); 43 //資料歸一化處理 44 void changeData(double data[][innode], int x); 45 46 int main() 47 { 48 int i,j; 49 int trainNum=0;//樣本訓練次數 50 double *r; //測試結果 51 int count=0;//正確測試結果數 52 double maxRate = 1.0;//輸出結果中的最大概率 53 //對權值和閾值進行初始化 54 init((double*)w, innode*hidenode); 55 init((double*)w1, hidenode*outnode); 56 init(b1, hidenode); 57 init(b2, outnode); 58 59 //讀取訓練資料 60 readData("./Iris-train.txt", trainData, trainsample); 61 //對訓練資料進行歸一化處理 62 changeData(trainData, trainsample); 63 64 /*for(i=0; i<trainsample; i++) 65 { 66 printf("%d: ",i+1); 67 for(j=0; j<innode; j++) 68 printf("%5.2lf",trainData[i][j]); 69 printf("\n"); 70 }*/ 71 //準備輸出樣本 72 for(i=0; i<trainsample; i++) 73 { 74 if(i<25) 75 { 76 outData[i][0] = 1; 77 outData[i][1] = 0; 78 outData[i][2] = 0; 79 } 80 else if(i<50) 81 { 82 outData[i][0] = 0; 83 outData[i][1] = 1; 84 outData[i][2] = 0; 85 } 86 else 87 { 88 outData[i][0] = 0; 89 outData[i][1] = 0; 90 outData[i][2] = 1; 91 } 92 } 93 94 printf("開始訓練\n"); 95 while(trainNum < 10000) 96 { 97 e = 0.0; 98 trainNum++; 99 train(trainData, outData); 100 printf("訓練第%d次, error=%8.4lf\n", trainNum, error); 101 } 102 printf("訓練完成\n\n"); 103 104 //讀入測試資料 105 readData("./Iris-test.txt", testData, testsample); 106 //歸一化測試資料 107 changeData(testData, testsample); 108 for(i=0; i<testsample; i++) 109 { 110 r = recognize(testData[i]); 111 for(j=0; j<outnode; j++) 112 printf("\t%7.4lf\t",r[j]); 113 printf("\n"); 114 //判斷檢測結果是否正確 115 if(i<25 && r[0]>r[1] && r[0]>r[2]) 116 count++; 117 if(i>=25 && i<50 && r[1]>r[0] && r[1]>r[2]) 118 count++; 119 if(i>=50 && r[2]>r[0] && r[2]>r[1]) 120 count++; 121 } 122 123 printf("\n\n共有%d個檢測樣本, 正確檢測出%d個, 準確率: %7.4lf\n\n",testsample, count, (double)count/testsample); 124 system("pause"); 125 return 0; 126 } 127 128 //初始化函式(0到1之間的數) 129 void init(double w[], int n) 130 { 131 int i; 132 srand((unsigned int)time(NULL)); 133 for(i=0; i<n; i++) 134 { 135 w[i] = 2.0*((double)rand()/RAND_MAX)-1; 136 } 137 } 138 139 //BP訓練函式 140 void train(double trainData[trainsample][innode], double label[trainsample][outnode]) 141 { 142 double x[innode];//輸入層的個輸入值 143 double yd[outnode];//期望的輸出值 144 145 double o1[hidenode];//隱層結點啟用值 146 double o2[hidenode];//輸出層結點啟用值 147 double x1[hidenode];//隱層向輸出層的輸入 148 double x2[outnode];//輸出結點的輸出 149 /********************************************************************* 150 o1: 隱層各結點的啟用值等於與該結點相連的各路徑上權值與該路徑上的輸入相乘後全部相加 151 ********************************************************************** 152 x1: 隱層結點的輸出,計算出o1後才能計算x1,等於 1.0/(1.0 + exp-(啟用值+該結點的閾值)) 153 *********************************************************************** 154 o2: 輸出層結點的啟用值等於與該結點相連的各路徑上的權值與該路徑的輸入相乘後全部相加 155 *********************************************************************** 156 x2: 輸出層結點的輸出,計算出o2後才能計算x2,等於 1.0/(1.0 + exp-(啟用值+該結點的閾值)) 157 ***********************************************************************/ 158 159 /*qq計算方式 (期望輸出 - 實際輸出)乘上 實際輸出 乘上 (1-實際輸出) */ 160 double qq[outnode];//期望的輸出與實際輸出的偏差 161 162 double pp[hidenode];//隱含結點校正誤差 163 164 165 int issamp; 166 int i,j,k; 167 for(issamp=0; issamp<trainsample; issamp++) 168 { 169 for(i=0; i<innode; i++) 170 x[i] = trainData[issamp][i]; 171 172 for(i=0; i<outnode; i++) 173 yd[i] = label[issamp][i]; 174 175 //計算隱層各結點的啟用值和隱層的輸出值 176 for(i=0; i<hidenode; i++) 177 { 178 o1[i] = 0.0; 179 for(j=0; j<innode; j++) 180 o1[i] = o1[i]+w[j][i]*x[j]; 181 x1[i] = 1.0/(1.0+exp(-o1[i]-b1[i])); 182 } 183 184 //計算輸出層各結點的啟用值和輸出值 185 for(i=0; i<outnode; i++) 186 { 187 o2[i] = 0.0; 188 for(j=0; j<hidenode; j++) 189 o2[i] = o2[i]+w1[j][i]*x1[j]; 190 x2[i] = 1.0/(1.0+exp(-o2[i]-b2[i])); 191 } 192 193 //得到了x2輸出後接下來就要進行反向傳播了 194 195 //計算實際輸出與期望輸出的偏差,反向調節隱層到輸出層的路徑上的權值 196 for(i=0; i<outnode; i++) 197 { 198 qq[i] = (yd[i]-x2[i]) * x2[i] * (1-x2[i]); 199 for(j=0; j<hidenode; j++) 200 w1[j][i] = w1[j][i]+rate_w1*qq[i]*x1[j]; 201 } 202 203 //繼續反向傳播調整輸出層到隱層的各路徑上的權值 204 for(i=0; i<hidenode; i++) 205 { 206 pp[i] = 0.0; 207 for(j=0; j<outnode; j++) 208 pp[i] = pp[i]+qq[j]*w1[i][j]; 209 pp[i] = pp[i]*x1[i]*(1.0-x1[i]); 210 211 for(k=

相關推薦

BP神經網路鳶尾花

1 #include <stdio.h> 2 #include <math.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <string> 6 #include

神經網路梯度下降法和反向傳播BP

梯度下降法和反向傳播網上資料非常多,記錄點自己理解的 1.梯度下降法是為了使損失函式求最小,而梯度方向是函式增長最快的方向,前面加個負號就變成函式減少最快的方向:                  

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) 更新引數(目標是誤差變小),迭代前面兩

深入淺出|深度學習演算法BP神經網路 詳細公式推導

所謂神經網路,目前用得最廣泛的一個定義是“的神經網路是由具有適應性簡單單元組成的廣泛並行互連的網路,它的組織能夠模擬生物神經系統對真實世界物體所做出的互動反應”。 BP(back propagation)神經網絡一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用

菜鳥學matlab智慧演算法(2)——————————BP神經網路演算法

一.演算法背景和理論 BP(Back Propagation)神經網路是1986年由Rumelhart和McCelland為首的科學家小組提出,是一種按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一。BP網路能學習和存貯大量的輸入-輸出

神經網路BP演算法

文章轉載於http://www.cnblogs.com/charlotte77/p/5629865.html。  最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文

簡單易學的機器學習演算法——神經網路BP神經網路

%% BP的主函式 % 清空 clear all; clc; % 匯入資料 load data; %從1到2000間隨機排序 k=rand(1,2000); [m,n]=sort(k); %輸入輸出資料 input=data(:,2:25); output1 =data(:,1); %把輸出從1維變

BP神經網路演算法matlab具體實現

之前的幾篇部落格的一個共同點就是梯度下降法,梯度下降法是用來求解無約束最優化問題的一個數值方法,簡單實用,幾乎是大部分演算法的基礎,下面來利用梯度下降法優化BP神經網路。 [TOC] 梯度公式 下面的BP神經網路結構為最簡單的三層網路,各層的神經元數量

機器學習02BP神經網路圖解及JAVA實現

package com.fei.bp02; public class Bp { private double[] hide1_x;//// 輸入層即第一層隱含層的輸入;hide1_x[資料的特徵數目+1], hide1_x[0]為1 private

機器學習BP神經網路 以及 tensorflow 實現

BP (Back Propagation)神經網路簡介 : 先介紹一下神經元,在生物神經網路中,每個神經元與其它神經元相連,當一個神經元“興奮”時,就會通過穿出神經向其它神經元傳送化學物質,其它神經元會通過穿人神經接受資訊然後再傳遞至神經中樞處理資訊。現在機器

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

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

卷積神經網路早期架構

文章目錄 早期架構 lenet5架構 小結 程式碼 Dan Ciresan Net 後續幾種網路的概要 早期架構 文件存放更新地址:https://gith

BP神經網路 如何進行權值的初始化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

卷積神經網路OverFeat(2014)

文章目錄 OverFeat 前言 概要 模型 OverFeat 分類 多尺度卷積(FCN) 多尺度分類(offset池化) 定位

卷積神經網路卷積計算、作用與思想

部落格:blog.shinelee.me | 部落格園 | CSDN 卷積運算與相關運算 在計算機視覺領域,卷積核、濾波器通常為較小尺寸的矩陣,比如\(3\times3\)、\(5\times5\)等,數字影象是相對較大尺寸的2維(多維)矩陣(張量),影象卷積運算與相關運算的關係如下圖所示(圖片來自連結)

遺傳演算法+BP神經網路組合求解非線性函式

用遺傳演算法求解非線性問題是常見的求解演算法之一,求解的過程就是隨機生成解,計算適應度,然後選擇,交叉,變異,更新種群,不斷迭代,這樣,每個個體都會向每代中最佳的個體學習並靠攏,這是區域性最優解;而變異操作是為了在靠近當前最優解的同時還有機會變異出更佳的基因,從而跳出區域性最優解而達到全域性最優解。

優達學城-神經網路預測共享單車使用情況 程式碼分析

優達學城-神經網路之預測共享單車使用情況 程式碼分析 標籤(): 機器學習 程式碼來自於優達學城深度學習納米學位課程的第一個專案 https://cn.udacity.com/course/deep-learning-nanodegree-foundation–nd101

BP神經網路說明及推導

    學習神經網路,很多基礎知識不用就會忘了,這段時間重新進行一下整理和總結。在此留做記錄。首先從最基礎的BP神經網路開始。並進行相關演算法的推導。     人工神經網路是仿照人大腦的功能而用數學公式搭建的一種結構。現在藉助計算機語言在高效能的計算機上得

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

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