神经网络: 计算简单的加法
下面是完整的代码:
- //
- //fann_test.c:
- //FANN测试
- //
- //到下面的网站下载FANN库:
- //FastArtificialNeuralNetworkLibrary(fann)
- //http://leenissen.dk/fann/
- //下载链接:DownloadFANN--->CSourceCodeandWindowsDLLfiles
- //
- #include"../fann-2.0.0/src/include/doublefann.h"
- #ifdef_DEBUG
- #pragmacomment(lib,"../fann-2.0.0/MicrosoftWindowsDll/bin/fanndoubleMTd.lib")
- #else
- #pragmacomment(lib,"../fann-2.0.0/MicrosoftWindowsDll/bin/fanndoubleMT.lib")
- #endif
- //训练:
- //加法神经网络
- //c=a+b;
- voidtrain()
- {
- constunsignedintnum_input=2;//输入项个数
- constunsignedintnum_output=1;//输出项个数
- constunsignedintnum_layers=3;
- constunsignedintnum_neurons_hidden=3;
- constfloatdesired_error=(constfloat)0.00000001;
- constunsignedintmax_epochs=500000;//最多执行次数
- constunsignedintepochs_between_reports=10000;//报告频率
- structfann*ann;
- intNum=200;
- floatMf=Num*3.f;
- inti;
- doublea,b,c;
- FILE*fp;
- fopen_s(&fp,"add.fann","w");
- fprintf_s(fp,"%d21/n",Num);
- //生成训练文件
- for(i=1;i<=Num;i++){
- //生成2个数,要求在(0,1)之间
- a=i/Mf;
- b=(i+1)/Mf;
- c=a+b;//要求在(0,1)之间
- //输入内容写到训练文件
- fprintf_s(fp,"%lf%lf/n%lf/n",a,b,c);
- }
- fclose(fp);
- //样本训练
- ann=fann_create_standard(num_layers,num_input,num_neurons_hidden,num_output);
- fann_set_activation_function_hidden(ann,FANN_LINEAR);
- fann_set_activation_function_output(ann,FANN_LINEAR);
- fann_train_on_file(ann,"add.fann",max_epochs,epochs_between_reports,desired_error);
- fann_save(ann,"add.fann.net");
- fann_destroy(ann);
- }
- //执行:
- //测试
- voidexec(doublea,doubleb)
- {
- structfann*ann;
- fann_type*calc_out;
- fann_typeinput[2];
- ann=fann_create_from_file("add.fann.net");
- input[0]=a;
- input[1]=b;
- calc_out=fann_run(ann,input);
- fann_destroy(ann);
- printf("a=%f/nb=%f/nc=%f/n期望值c=%f/n/n",input[0],input[1],calc_out[0],input[0]+input[1]);
- }
- //
- //主程序
- //
- intmain()
- {
- //下面的方法只需调用一次,然后注释掉
- //train();
- exec(0.354,0.58934);
- exec(0.21469,0.3914968);
- exec(0.130,0.44);
- exec(-0.3654,0.58455);
- exec(0.365420,-0.95);
- return0;
- }