您好,欢迎访问三七文档
1实验报告课程名称人工智能应用技术实验项目人工神经网络程序设计实验仪器WindowsXP、VisualC++学院信息管理学院专业管理科学/电子商务/计算机审计/信息安全班级/学号信安0901-2009012225学生姓名郭瑞实验日期2011-4-6成绩指导教师赵刚2北京信息科技大学信息管理学院(课程上机)实验报告实验课程名称:人工智能应用技术专业:信息安全班级:信安0901学号:2009012225姓名:郭瑞实验名称人工神经网络程序设计实验地点计算中心实验时间4/618:00—21:201.实验目的:掌握基本神经网络的常用学习规则掌握人工神经网络的训练过程2.实验内容:相关知识:基本神经网络(感知器,前馈网络)的常用学习规则实验环境:WindowsXP,VisualC++6.0主要内容:人工神经网络的程序设计与实现3.实验要求:完成神经网络学习程序的调试,课堂演示程序执行结果分析结果数据,绘制神经网络提交实验报告4.实验准备:掌握感知器学习算法①初始化:将权值向量赋予随机值,t=0(迭代次数)②连接权的修正:对每个输入样本xk及期望输出dk完成如下计算a.计算网络输出:y=f(S),其中S=∑wixi,f为激活函数b.计算输出层单元期望输出dk与实际输出y间的误差:ek=dk-yc.若ek为零,则说明当前样本输出正确,不必更新权值,否则更新权值:w(t+1)=w(t)+α×ek×xkt=t+10α1为学习率。③对所有的输入样本重复步骤(2),直到所有的样本输出正确为止35.实验过程:#includestdlib.h#includemath.h#includestdio.h#includetime.h#defineOUT_COUT2//输出向量维数#defineIN_COUT3//输入向量维数#defineCOUT6//样本数量typedefstruct{//bp人工神经网络结构inth;//实际使用隐层数量doublev[IN_COUT][50];//隐藏层权矩阵i,隐层节点最大数量为100doublew[50][OUT_COUT];//输出层权矩阵doublea;//学习率doubleb;//精度控制参数intLoopCout;//最大循环次数}bp_nn;doublefnet(doublenet){//Sigmoid函数,神经网络激活函数return1/(1+exp(-net));}intInitBp(bp_nn*bp){//初始化bp网络printf(请输入隐层节点数,最大数为100:\n);scanf(%d,&(*bp).h);printf(请输入学习率:\n);scanf(%lf,&(*bp).a);//(*bp).a为double型数据,所以必须是lfprintf(请输入精度控制参数:\n);scanf(%lf,&(*bp).b);printf(请输入最大循环次数:\n);scanf(%d,&(*bp).LoopCout);inti,j;srand((unsigned)time(NULL));for(i=0;iIN_COUT;i++)for(j=0;j(*bp).h;j++)(*bp).v[i][j]=rand()/(double)(RAND_MAX);for(i=0;i(*bp).h;i++)for(j=0;jOUT_COUT;j++)4(*bp).w[i][j]=rand()/(double)(RAND_MAX);return1;}intTrainBp(bp_nn*bp,floatx[COUT][IN_COUT],inty[COUT][OUT_COUT]){//训练bp网络,样本为x,理想输出为ydoublef=(*bp).b;//精度控制参数doublea=(*bp).a;//学习率inth=(*bp).h;//隐层节点数doublev[IN_COUT][50],w[50][OUT_COUT];//权矩阵doubleCh_v[IN_COUT][50],Ch_w[50][OUT_COUT];//权矩阵修改量doubleChgH[50],ChgO[OUT_COUT];//修改量矩阵doubleO1[50],O2[OUT_COUT];//隐层和输出层输出量intLoopCout=(*bp).LoopCout;//最大循环次数inti,j,k,n;doubletemp;for(i=0;iIN_COUT;i++)//复制结构体中的权矩阵for(j=0;jh;j++)v[i][j]=(*bp).v[i][j];for(i=0;ih;i++)for(j=0;jOUT_COUT;j++)w[i][j]=(*bp).w[i][j];doublee=f+1;for(n=0;ef&&nLoopCout;n++){//对每个样本训练网络e=0;for(j=0;jOUT_COUT;j++)ChgO[j]=0;for(j=0;jh;j++)ChgH[j]=0;for(j=0;jh;j++)for(k=0;kOUT_COUT;k++)Ch_w[j][k]=0;for(j=0;jIN_COUT;j++)for(k=0;kh;k++)Ch_v[j][k]=0;for(i=0;iCOUT;i++){for(k=0;kh;k++){//计算隐层输出向量temp=0;for(j=0;jIN_COUT;j++)temp=temp+x[i][j]*v[j][k];O1[k]=fnet(temp);5}for(k=0;kOUT_COUT;k++){//计算输出层输出向量temp=0;for(j=0;jh;j++)temp=temp+O1[j]*w[j][k];O2[k]=fnet(temp);}for(j=0;jOUT_COUT;j++)//计算输出误差e=e+(y[i][j]-O2[j])*(y[i][j]-O2[j]);for(j=0;jOUT_COUT;j++)ChgO[j]=O2[j]*(1-O2[j])*(y[i][j]-O2[j]);for(j=0;jh;j++)for(k=0;kOUT_COUT;k++)Ch_w[j][k]+=a*O1[j]*ChgO[k];//累加所有样本训练后的改变量for(j=0;jh;j++){temp=0;for(k=0;kOUT_COUT;k++)temp=temp+w[j][k]*ChgO[k];ChgH[j]=temp*O1[j]*(1-O1[j]);}for(j=0;jIN_COUT;j++)for(k=0;kh;k++)Ch_v[j][k]+=a*x[i][j]*ChgH[k];//累加所有样本训练后的改变量,消除样本顺序影响}for(j=0;jh;j++)//修改输出层权矩阵for(k=0;kOUT_COUT;k++)w[j][k]=w[j][k]+Ch_w[j][k];for(j=0;jIN_COUT;j++)//修改隐藏层权矩阵for(k=0;kh;k++)v[j][k]=v[j][k]+Ch_v[j][k];if(n%10==0){printf(误差:%f\n,e);printf(循环次数:%d\n,n);}}printf(总共循环次数:%d\n,n);printf(调整后的隐层权矩阵:\n);for(i=0;iIN_COUT;i++){for(j=0;jh;j++)printf(%f,v[i][j]);printf(\n);}6printf(调整后的输出层权矩阵:\n);for(i=0;ih;i++){for(j=0;jOUT_COUT;j++)printf(%f,w[i][j]);printf(\n);}for(i=0;iIN_COUT;i++)//把结果复制回结构体for(j=0;jh;j++)(*bp).v[i][j]=v[i][j];for(i=0;ih;i++)for(j=0;jOUT_COUT;j++)(*bp).w[i][j]=w[i][j];printf(bp网络训练结束!\n);return1;}intUseBp(bp_nn*bp){//使用bp网络floatInput[IN_COUT];doubleO1[50];doubleO2[OUT_COUT];//O1为隐层输出,O2为输出层输出while(1){//持续执行,除非中断程序printf(请输入3个数:\n);inti,j;for(i=0;iIN_COUT;i++)scanf(%f,&Input[i]);doubletemp;for(i=0;i(*bp).h;i++){temp=0;for(j=0;jIN_COUT;j++)temp+=Input[j]*(*bp).v[j][i];O1[i]=fnet(temp);}for(i=0;iOUT_COUT;i++){temp=0;for(j=0;j(*bp).h;j++)temp+=O1[j]*(*bp).w[j][i];O2[i]=fnet(temp);}printf(结果:);for(i=0;iOUT_COUT;i++)printf(%.3f,O2[i]);printf(\n);}7return1;}intmain(){floatx[COUT][IN_COUT]={{0.8,0.5,0},{0.9,0.7,0.3},{1,0.8,0.5},{0,0.2,0.3},{0.2,0.1,1.3},{0.2,0.7,0.8}};//训练样本inty[COUT][OUT_COUT]={{0,1},{0,1},{0,1},{1,0},{1,0},{1,0}};//理想输出bp_nnbp;InitBp(&bp);//初始化bp网络结构TrainBp(&bp,x,y);//训练bp神经网络UseBp(&bp);//测试bp神经网络return1;}896.实验总结:(实验结果及分析)10在本次试验中,通过进一步的对神经网络进行了解,加深理解,试着进行编程,实现其功能,当中进行了好长时间的调试,有点困难,但最终做出来了,还是非常开心的!说明:1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
本文标题:信安0901 2009012225-郭瑞 人工智能应用技术实验报告-人工神经网络程序设计
链接地址:https://www.777doc.com/doc-4232899 .html