BP神經網路——訓練一個加法運算
阿新 • • 發佈:2018-12-11
#include <stdio.h> #include <math.h> #include <time.h> #include <stdlib.h> #define num 3000 #define learn 0.001 double qiankui(double x0,double x1,double w[4],double v[2]){ return (x0 * w[0] + x1 * w[1])*v[0] + (x0 * w[2] + x1 * w[3])*v[1]; } void houfankui(double x0,double x1,double output,double true_aws,double w[4],double v[2]){ w[0] = w[0] - learn*(-(true_aws-output)*v[0]*x0); w[1] = w[1] - learn*(-(true_aws-output)*v[0]*x1); w[2] = w[2] - learn*(-(true_aws-output)*v[1]*x0); w[3] = w[3] - learn*(-(true_aws-output)*v[1]*x1); v[0] = v[0] - learn*(-(true_aws-output)*(x0 * w[0] + x1 * w[1])); v[1] = v[1] - learn*(-(true_aws-output)*(x0 * w[2] + x1 * w[3])); } int main(int argc, char *argv[]) { double a[num][2]; double b[num]; srand(time(NULL)); for (int i = 0; i < num; ++i) { a[i][0]=rand()/(double)(RAND_MAX/10); a[i][1]=rand()/(double)(RAND_MAX/10); b[i] = a[i][0] + a[i][1]; // printf("%f\n", b[i]); } double input_0,input_1,output; double w[4]={1.0,1.0,1.0,1.0},v[2]={1.0,1.0}; double total; for (int i = 0; i < num; ++i) { input_0 = a[i][0]; input_1 = a[i][1]; output = qiankui(input_0,input_1,w,v); houfankui(input_0,input_1,output,b[i],w,v); } double x0,x1; srand(time(NULL)); x0=rand()/(double)(RAND_MAX/10); x1=rand()/(double)(RAND_MAX/10); double o_h0 = x0 * w[0] + x1 * w[1]; double o_h1 = x0 * w[2] + x1 * w[3]; double result = o_h0 * v[0] + o_h1 * v[1]; printf("%f\n", result); printf("%f\n", x0 + x1); printf("%f\n", (result - x0 - x1)/result > 0 ? 100*(result - x0 - x1)/result : -100*(result - x0 - x1)/result); return 0; }