版权声明:所有文章都是自己编写整理,可以转载分享。--Zen in Zen https://blog.csdn.net/weixin_32393347/article/details/86018581
神经网络晶体管显示
题目要求
一、题目要求
设用7个短线段构成1,2,…,9,0共10个数码图形,令这7个线段分别用一个矢量来代表,又设对数码图形中用到的线段,相应分量取值为1,未用到的线段相应的分量取值为0,因此每个数码图形分别可由一个矢量表示,其顺序编号为:,试设计一神经网络,能够区分奇数码和偶数码。
流程图
源代码
#include<iostream.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <fstream.h>
void main()
{
double X[10][8]={{1,0,0,1,1,0,0,0},{1,0,1,1,0,1,1,1},{1,0,1,1,1,1,0,1},{1,1,0,1,1,0,0,1},{1,1,1,0,1,1,0,1},{1,1,1,0,1,1,1,1},{1,1,1,1,1,0,0,0},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,0,1},{1,1,1,1,1,1,1,0}};//样本输入
double Y[10]={1,0,1,0,1,0,1,0,1,0};//目标输出
double y[10]={0};
float s=0.0,e=0.000,E=0.000;//误差
int i,j,pass=0;
double step=0.02;//学习步长
double W[8]={0};//权值
double dertw[8]={0};//权值调整量
/////////////////////////////////权值/////////////////////////////////
srand((unsigned)time(NULL));//以时间为种子产生随机数
ofstream out("数码管.txt");
out<<"初始的连接权值和阈值:\n";
for (i=0;i<8;i++)
{
W[i]=(rand()%100)/100.0;//权值赋初始值[0,1]
out<<"W["<<i<<"]="<<W[i]<<endl;
}
do //训练样本
{
++pass;
E=0;
double max=0;
///////////////////////////////学习样本//////////////////////
for (i=0;i<10;i++)
{
for (j=0;j<8;j++)
{
s=s+X[i][j]*W[j];
}
if (s<0)
{
y[i]=0;
}
else
{
y[i]=1;
}
s=0.00;//活化值置零
e=fabs(Y[i]-y[i]);//计算偏差
E=E+fabs(e);
if (e>max)
{
max=e;
}
}
//////////////////////////////判断误差/////////////////////////////
if (max<0.00001)
{
break;
}
///////////////////////////////权值修改///////////////////////////
for (i=0;i<10;i++)
{
for (j=0;j<8;j++)
{
dertw[j]=step*(Y[i]-y[i])*X[i][j];
W[j]=W[j]+dertw[j];
}
}
} while(pass<6000);
out<<"训练次数为:"<<pass<<"小于最大训练次数6000,结果可靠!\n";
out<<"输出训练后的权值:"<<"\n";
for (i=0;i<8;i++)
{
out<<"w["<<i<<"]="<<W[i]<<"\n";
}
out<<"输出训练后样本测试结果:训练结果与真实值的对比"<<"\n";
out<<"\n";
for (i=0;i<10;i++)//对样本进行验证
{
for (j=0;j<8;j++)
{
y[i]=y[i]+X[i][j]*W[j];
}
if (y[i]<0)
{
y[i]=0;
}
else
{
y[i]=1;
}
out<<"y["<<i<<"]="<<y[i]<<" ";
out<<"Y["<<i<<"]="<<Y[i]<<" \n";
}
}