1、 掌握人工神经网络的训练过程2. 实验内容: 相关知识:基本神经网络(感知器,前馈网络)的常用学习规则 实验环境:Windows XP, Visual studio 主要内容:人工神经网络的程序设计与实现3. 实验要求: 完成神经网络学习程序的调试,课堂演示程序执行结果 输出神经网络权值调整过程值,分析结果数据,绘制神经网络 提交实验报告4. 实验准备:掌握感知器学习算法1 初始化:将权值向量赋予随机值,t=0(迭代次数)2 连接权的修正:对每个输入样本xk及期望输出dk完成如下计算a. 计算网络输出:y = f(S),其中S =wixi,f为激活函数b. 计算输出层单元期望输出dk与实际输出
2、y间的误差: ek = dk - yc. 若ek为零,则说明当前样本输出正确,不必更新权值,否则更新权值: w(t+1) = w(t) + ek xk t = t + 1 01为学习率。3 对所有的输入样本重复步骤(2),直到所有的样本输出正确为止5. 实验过程:#include #include stdafx.h#define MAX_ITERATIONS 1000#define INPUT_NEURONS 2#define NUM_WEIGHTS (INPUT_NEURONS+1)#define ALPHA (double)0.2double weightsNUM_WEIGHTS;type
3、def struct double a; double b; double expected; training_data_t;#define MAX_TESTS 4training_data_t training_setMAX_TESTS= -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0 ;double compute( int test ) double result; /* Equation 10.2 */ result = (training_settest.a * weights0) + (trainin
4、g_settest.b * weights1) + (1.0 * weights2) ); if (result 0.0) result = 1.0; else result = -1.0; return result;int main() int i, test; double output; int change; /* Initialize the weights for the perceptron */ for ( i = 0 ; i NUM_WEIGHTS ; i+ ) weightsi = 0.0; /* Train the perceptron with the trainin
5、g set */ change = 1; while (change) change = 0; for ( test = 0 ; test maths.crand.h#define INPUT_NEURONS 35#define HIDDEN_NEURONS 10#define OUTPUT_NEURONS 10double inputsINPUT_NEURONS+1;double hiddenHIDDEN_NEURONS+1;double outputsOUTPUT_NEURONS;#define RHO (double)0.1double w_h_iHIDDEN_NEURONSINPUT_
6、NEURONS+1;double w_o_hOUTPUT_NEURONSHIDDEN_NEURONS+1;#define RAND_WEIGHT (double)rand() / (double)RAND_MAX) - 0.5)#define IMAGE_SIZE 35typedef struct test_images_s int imageIMAGE_SIZE; int outputOUTPUT_NEURONS; test_image_t;#define MAX_TESTS 10test_image_t testsMAX_TESTS = 0,1,1,1,0, / 0 1,0,0,0,1,
7、0,1,1,1,0 , 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0,0,1,0,0, / 1 0,1,1,0,0, 0,0,1,0,0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0,1,1,1,0, / 2 0,0,0,0,1, 0,0,1,1,0, 0,1,0,0,0, 1,0,0,0,0, 1,1,1,1,1 , 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0,1,1,1,0, / 3 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 0,0,0,1,0, / 4 0,1,0,1,0, 1,1,1,1,1, 0,0,
8、0,1,0, 0,0,0,1,0 , 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 , 1,1,1,1,1, / 5 1,1,1,1,0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0,1,1,1,0, / 6 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1,1,1,1,1, / 7 0,1,0,0,0 , 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 , 0,1,1,1,0, / 8 0,1,1,1,0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 , 0,1,1,1,0, / 9 0,1,1,1,1, 0,1,1,
9、0,0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ;void init_network( void ) int i, j; /* Set the input bias */ inputsINPUT_NEURONS = 1.0; /* Set the hidden bias */ hiddenHIDDEN_NEURONS = 1.0; /* Initialize the input-hidden weights */ for (j = 0 ; j HIDDEN_NEURONS ; j+) INPUT_NEURONS+1 ; w_h_iji = RAND_WEIGHT; OUT
10、PUT_NEURONS ; HIDDEN_NEURONS+1 ; w_o_hji = RAND_WEIGHT; return;void feed_forward( void ) /* Calculate outputs of the hidden layer */ hiddeni = 0.0; hiddeni += (w_h_iij * inputsj); hiddeni = sigmoid( hiddeni ); /* Calculate outputs for the output layer */ outputsi = 0.0; outputsi += (w_o_hij * hidden
11、j ); outputsi = sigmoid( outputsi );void backpropagate_error( int test ) int out, hid, inp; double err_outOUTPUT_NEURONS; double err_hidHIDDEN_NEURONS; /* Compute the error for the output nodes (Equation 10.6) */ for (out = 0 ; out out+) err_outout = (double)teststest.outputout - outputsout) * sigmo
12、id_d(outputsout); /* Compute the error for the hidden nodes (Equation 10.7) */ for (hid = 0 ; hid hid+) err_hidhid = 0.0; /* Include error contribution for all output nodes */ err_hidhid += err_outout * w_o_houthid; err_hidhid *= sigmoid_d( hiddenhid ); /* Adjust the weights from the hidden to outpu
13、t layer (Equation 10.9) */ w_o_houthid += RHO * err_outout * hiddenhid; /* Adjust the weights from the input to hidden layer (Equation 10.9) */ for (inp = 0 ; inp inp+) w_h_ihidinp += RHO * err_hidhid * inputsinp;double calculate_mse( int test ) double mse = 0.0; int i; mse += sqr( (teststest.output
14、i - outputsi) ); return ( mse / (double)i );void set_network_inputs( int test, double noise_prob ) /* Fill the network inputs vector from the test */ INPUT_NEURONS ; inputsi = teststest.imagei; /* In the given noise probability, negate the cell */ if (RANDOM() max) max = outputsi; best = i; return b
15、est;int main( void ) double mse, noise_prob; int test, i, j; RANDINIT(); init_network(); do /* Pick a test at random */ test = RANDMAX(MAX_TESTS); /* Grab input image (with no noise) */ set_network_inputs( test, 0.0 ); /* Feed this data set forward */ feed_forward(); /* Backpropagate the error */ ba
16、ckpropagate_error( test ); /* Calculate the current MSE */ mse = calculate_mse( test ); while (mse 0.001); /* Now, lets test the network with increasing amounts of noise */ /* Start with 5% noise probability, end with 25% (per pixel) */ noise_prob = 0.05; 5 ; set_network_inputs( test, noise_prob );
17、if (j % 5) = 0) printf(n);%d , (int)inputsj); printf( nclassified as %dnn, classifier() ); noise_prob += 0.05;6. 实验总结:(实验结果及分析)通过人工神经程序设计的学习,我进一步了解了感知器和神经网络算法,包括期望值的调整等内容,同时更加熟练地使用c语言进行程序设计,对程序设计中遇到的各种问题渐渐地有了自己的认识和解决方案。说明:1. 实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;2. 实验准备由学生在实验或上机之前填写,教师应该在实验前检查;3. 实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;4. 实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;5. 源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1