⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.cpp

📁 自己写的一个简单的神经网络(BP)算法
💻 CPP
字号:

//****样本在文件sample.txt中,程序运行的结果在result.txt中****//
#include<iostream>
#include<fstream>
#include<ctime>
#include<cmath>
using namespace std;
#define n 2
#define H 2
#define m 1
#define T 4  //样本个数
double W[H][m];  //输出层的权矩阵
double sita_h[H]; //隐藏层阈值
double sita_o[m]; //输出层阈值
double V[n][H];  //输出(隐藏)层的权矩阵
double delta_o[m];  //输出层各联结权的修改量组成的向量
double delta_h[H];  //隐藏层各联结权的修改量组成的向量
double hide_s[H];  //隐藏层的激活值
double hide_o[H];  //隐藏层的输出值
double output_s[m];  //输出层的激活值
double output_o[m];  //输出层的输出值
double input[T][n];  //输入层的输入向量
double output[T][m];  //期望的输出值
double E;  //误差
double sigma;  //精度控制参数
double alpha;  //学习率
int M;  //循环最大次数

//****初始化函数****//
void initialize()
{
	int i,j;
	for(i = 0; i < H; i++)
	{
		hide_s[i] = 0;
		hide_o[i] = 0;
		delta_h[i] = 0;
		sita_h[i] = rand() / ( RAND_MAX + 1.0 );
	}
	for(i = 0; i < m; i++)
	{
		sita_o[i] = rand() / ( RAND_MAX + 1.0 );
		output_s[i] = 0;
		output_o[i] = 0;
		delta_o[i] = 0;
	}
	for(i = 0; i < H; i++)
		for(j = 0; j < m; j++)
			W[i][j] = rand() / ( RAND_MAX + 1.0 );
	for(i = 0; i < n; i++)
		for(j = 0; j < H; j++)
			V[i][j] = rand() / ( RAND_MAX + 1.0 );
}

int main()
{
	int i,j,t,N;
	double error;
	ofstream fout( "result.txt" );
	if( !fout )
		cout << " can't create bp.txt\n " ;
	cout << "请输入学习率:alpha=";
	cin >> alpha;
	cout << endl << "请输入误差控制精度:sigma=";
	cin >> sigma;
	cout << endl << "请输入循环的最大次数:M=";
	cin >> M;
	ifstream fin( "sample.txt" );
	if( !fin )
		cout << " can't open sample.txt\n";
	for(i = 0; i < T; i++)
		fin >> input[i][0] >> input[i][1] >> output[i][0];
	fin.close();
	E = sigma + 1;
	N = 0;
    initialize();
	while( E > sigma && N < M)
	{
		N++;
		for(t = 0; t < T; t++)
		{
			for(i = 0; i < H; i++)
			{
				hide_s[i] = 0;
				for(j = 0; j < n; j++)
					hide_s[i] += V[j][i] * input[t][j];
				hide_s[i] -= sita_h[i];
				hide_o[i] = 1.0 / ( 1.0 + exp(-hide_s[i]) );
			}
			for(i = 0; i < m; i++)
			{
				output_s[i] = 0;
				for(j = 0; j < H; j++)
					output_s[i] += W[j][i] * hide_o[j];
				output_s[i] -= sita_o[i];
				output_o[i] = 1.0 / ( 1.0 + exp(-output_s[i]) );
			}

			for(i = 0; i < m; i++)
			{
				delta_o[i] = output_o[i] * ( 1 - output_o[i] ) * ( output[t][i] - output_o[i] );
				sita_o[i] -= alpha * delta_o[i];
			}
			
			for(i = 0; i < H; i++)
			{
				double Z = 0;
				for(j = 0; j < m; j++)
					Z += W[i][j] * delta_o[j];
				delta_h[i] = Z * hide_o[i] * ( 1 - hide_o[i] );
				sita_h[i] -= alpha * delta_h[i];
			}
			for(i = 0; i < H; i++)
			{
				for(j = 0; j < m; j++)
				{
					W[i][j] += alpha * hide_o[i] * delta_o[j];
				}
			}
			for(i = 0; i < n; i++)
				for(j = 0; j < H; j++)
				{
					V[i][j] += alpha * input[t][i] * delta_h[j];
				}
		}
		E = 0;
		for(t = 0; t < T; t++)
		{
			for(i = 0; i < H; i++)
			{
				hide_s[i] = 0;
				for(j = 0; j < n; j++)
					hide_s[i] += V[j][i] * input[t][j];
				hide_s[i] -= sita_h[i];
				hide_o[i] = 1.0 / ( 1.0 + exp(-hide_s[i]) );
			}
			for(i = 0; i < m; i++)
			{
				output_s[i] = 0;
				for(j = 0; j < H; j++)
					output_s[i] += W[j][i] * hide_o[j];
				output_s[i] -= sita_o[i];
				output_o[i] = 1.0 / ( 1.0 + exp(-output_s[i]) );
			}
			error = 0;
			for(i = 0;i < m; i++)
				error += ( output_o[i] - output[t][i] ) * ( output_o[i] - output[t][i] );
			E += error / 2;
		}
	}
	fout << "网络学习" << N << "次结束,误差为:" << E << ",各层的权值如下:" << endl;
	fout << "隐藏层到输出层权值:" << endl;
	for(i = 0; i < H; i++)
		for(j = 0; j < m; j++)
			fout << "W[" << i << "][" << j << "] = " << W[i][j] << ",";
		fout << endl << "输入层到隐藏层权值:" << endl;
	for(i = 0; i < n; i++)
		for(j = 0; j < H; j++)
			fout << "V[" << i << "][" << j << "] = " << V[i][j] << ",";
	fout << endl << "对应着样本实际输出为:"<< endl;
		for(t = 0; t < T; t++)
		{
			fout << input[t][0] << '\t' << input[t][1] << '\t';
			for(i = 0; i < H; i++)
			{
				hide_s[i] = 0;
				for(j = 0; j < n; j++)
					hide_s[i] += V[j][i] * input[t][j];
				hide_s[i] -= sita_h[i];
				hide_o[i] = 1.0 / ( 1.0 + exp(-hide_s[i]) );
			}
			for(i = 0; i < m; i++)
			{
				output_s[i] = 0;
				for(j = 0; j < H; j++)
					output_s[i] += W[j][i] * hide_o[j];
				output_s[i] -= sita_o[i];
				output_o[i] = 1.0 / ( 1.0 + exp(-output_s[i]) );
				fout << output_o[i] << '\t';
			}
			fout << endl;
		}
    fout.close();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -