BP神经网络——训练一个加法运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bw_yyziq/article/details/79993766
#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;
}

猜你喜欢

转载自blog.csdn.net/bw_yyziq/article/details/79993766