📄 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 + -