// ニューロネットワーク 誤差伝播法(Back Propagation)による学習 #include "stdafx.h" #include "math.h" #include "stdlib.h" #define NLEARN 10000 // 学習繰り返し回数 #define NSAMPLE 6 // 訓練データサンプル数 #define NINPUT 3 // 入力ノード数 #define NHIDDEN 5 // 中間層(隠れ層)の素子数 #define NOUTPUT 1 // 出力素子数 #define EPS 0.3 // 学習時重み修正の程度 #define ENDERR 0.001 //プログラム停止のための学習誤差 // 訓練データ    入力 : tx, 出力 : ty (tx, tyをファイルから入力してもよい) // (訓練データを変更するには、NINPUT, NOUTPUT, NSAMPLEを変更し、下記の表を変更) int tx[NSAMPLE][NINPUT] ={{0,0,0},{1,0,1},{1,1,1},{1,1,0},{1,0,0},{0,0,1}}; int ty[NSAMPLE][NOUTPUT]={ {0}, {0}, {1}, {0}, {1}, {1}}; // 素子データ 入力 : x, 隠れ素子 : h, 出力 : y(閏値用に1つ多く確保) float x[NINPUT+1], h[NHIDDEN+1], y[NOUTPUT]; float w1[NINPUT+1][NHIDDEN], w2[NHIDDEN+1][NOUTPUT];//重み float h_back[NHIDDEN+1], y_back[NOUTPUT];//隠れ素子, 出力素子の逆伝播量 float sigmoidTB[100]; // 計算高速化のためもシグモイド関数表 void initialize(){ // 初期化 for(int i=0; i<100;i++) // シグモイド関数表の初期化 sigmoidTB[i]=(float)(1.0/(1.0+exp((double)(i-50)*(-0.2)))); for(int i=0; i99) id=99; else if(id<0) id=0; return sigmoidTB[id]; } void proceed(int isample){ // float net; // 入力値を第1段目に移す for(int i=0; imerror) merror=error; // 誤差評価 printf("\n 学習回数= %d, 訓練データ No.=%d, 誤差=%f ", i, j+1, error); backProp(j); // 逆伝播 } if(merror