首页 > 代码库 > deep learning(1)BP神经网络原理与练习
deep learning(1)BP神经网络原理与练习
具体原理参考如下讲义:
1、神经网络
2、反向传导
3、梯度检验与高级优化
看完材料1和2就可以梳理清楚bp神经网络的基本工作原理,下面通过一个C语言实现的程序来练习这个算法
1 //Backpropagation, 25x25x8 units, binary sigmoid function network 2 //Written by Thomas Riga, University of Genoa, Italy 3 //thomas@magister.magi.unige.it 4 5 #include <iostream> 6 #include <fstream> 7 #include <conio.h> 8 #include <stdlib.h> 9 #include <math.h> 10 #include <ctype.h> 11 #include <stdio.h> 12 #include <float.h> 13 using namespace std; 14 15 double **input, 16 *hidden, 17 **output, 18 **target, 19 *bias, 20 **weight_i_h, 21 **weight_h_o, 22 *errorsignal_hidden, 23 *errorsignal_output; 24 25 int input_array_size, 26 hidden_array_size, 27 output_array_size, 28 max_patterns, 29 bias_array_size, 30 gaset = -2500, 31 number_of_input_patterns, 32 pattern, 33 file_loaded = 0, 34 ytemp = 0, 35 ztemp = 0; 36 double learning_rate, 37 max_error_tollerance = 0.1; 38 char filename[128]; 39 #define IA 16807 40 #define IM 2147483647 41 #define AM (1.0 / IM) 42 #define IQ 127773 43 #define IR 2836 44 #define NTAB 32 45 #define NDIV (1+(IM-1) / NTAB) 46 #define EPS 1.2e-7 47 #define RNMX (1.0 - EPS) 48 int compare_output_to_target(); 49 void load_data(char *arg); 50 void save_data(char *argres); 51 void forward_pass(int pattern); 52 void backward_pass(int pattern); 53 void custom(); 54 void compute_output_pattern(); 55 void get_file_name(); 56 float bedlam(long *idum); 57 void learn(); 58 void make(); 59 void test(); 60 void print_data(); 61 void print_data_to_screen(); 62 void print_data_to_file(); 63 void output_to_screen(); 64 int getnumber(); 65 void change_learning_rate(); 66 void initialize_net(); 67 void clear_memory(); 68 69 int main() 70 { 71 cout << "backpropagation network by Thomas Riga, University of Genoa, Italy" << endl; 72 for(;;) { 73 char choice; 74 cout << endl << "1. load data" << endl; 75 cout << "2. learn from data" << endl; 76 cout << "3. compute output pattern" << endl; 77 cout << "4. make new data file" << endl; 78 cout << "5. save data" << endl; 79 cout << "6. print data" << endl; 80 cout << "7. change learning rate" << endl; 81 cout << "8. exit" << endl << endl; 82 cout << "Enter your choice (1-8)"; 83 do { choice = getch(); } while (choice != ‘1‘ && choice != ‘2‘ && choice != ‘3‘ && choice != ‘4‘ && choice != ‘5‘ && choice != ‘6‘ && choice != ‘7‘ && choice != ‘8‘); 84 switch(choice) { 85 case ‘1‘: 86 { 87 if (file_loaded == 1) clear_memory(); 88 get_file_name(); 89 file_loaded = 1; 90 load_data(filename); 91 } 92 break; 93 case ‘2‘: learn(); 94 break; 95 case ‘3‘: compute_output_pattern(); 96 break; 97 case ‘4‘: make(); 98 break; 99 case ‘5‘:100 {101 if (file_loaded == 0)102 {103 cout << endl104 << "there is no data loaded into memory"105 << endl;106 break;107 }108 cout << endl << "enter a filename to save data to: ";109 cin >> filename;110 save_data(filename);111 }112 break;113 case ‘6‘: print_data();114 break;115 case ‘7‘: change_learning_rate();116 break;117 case ‘8‘: return 0;118 };119 }120 }121 122 void initialize_net()123 {124 int x;125 input = new double * [number_of_input_patterns];126 if(!input) { cout << endl << "memory problem!"; exit(1); }127 for(x=0; x<number_of_input_patterns; x++)128 {129 input[x] = new double [input_array_size];130 if(!input[x]) { cout << endl << "memory problem!"; exit(1); }131 }132 hidden = new double [hidden_array_size];133 if(!hidden) { cout << endl << "memory problem!"; exit(1); }134 output = new double * [number_of_input_patterns];135 if(!output) { cout << endl << "memory problem!"; exit(1); }136 for(x=0; x<number_of_input_patterns; x++)137 {138 output[x] = new double [output_array_size];139 if(!output[x]) { cout << endl << "memory problem!"; exit(1); }140 }141 target = new double * [number_of_input_patterns];142 if(!target) { cout << endl << "memory problem!"; exit(1); }143 for(x=0; x<number_of_input_patterns; x++)144 {145 target[x] = new double [output_array_size];146 if(!target[x]) { cout << endl << "memory problem!"; exit(1); }147 }148 bias = new double [bias_array_size];149 if(!bias) { cout << endl << "memory problem!"; exit(1); }150 weight_i_h = new double * [input_array_size];151 if(!weight_i_h) { cout << endl << "memory problem!"; exit(1); }152 for(x=0; x<input_array_size; x++)153 {154 weight_i_h[x] = new double [hidden_array_size];155 if(!weight_i_h[x]) { cout << endl << "memory problem!"; exit(1); }156 }157 weight_h_o = new double * [hidden_array_size];158 if(!weight_h_o) { cout << endl << "memory problem!"; exit(1); }159 for(x=0; x<hidden_array_size; x++)160 {161 weight_h_o[x] = new double [output_array_size];162 if(!weight_h_o[x]) { cout << endl << "memory problem!"; exit(1); }163 }164 errorsignal_hidden = new double [hidden_array_size];165 if(!errorsignal_hidden) { cout << endl << "memory problem!"; exit(1); }166 errorsignal_output = new double [output_array_size];167 if(!errorsignal_output) { cout << endl << "memory problem!"; exit(1); }168 return;169 }170 171 void learn()172 {173 if (file_loaded == 0)174 {175 cout << endl176 << "there is no data loaded into memory"177 << endl;178 return;179 }180 cout << endl << "learning..." << endl << "press a key to return to menu" << endl;181 register int y;182 while(!kbhit()) {183 for(y=0; y<number_of_input_patterns; y++) {184 forward_pass(y);185 backward_pass(y);186 }187 if(compare_output_to_target()) {188 cout << endl << "learning successful" << endl;189 return;190 }191 192 }193 cout << endl << "learning not successful yet" << endl;194 return;195 }196 197 void load_data(char *arg) {198 int x, y;199 ifstream in(arg);200 if(!in) { cout << endl << "failed to load data file" << endl; file_loaded = 0; return; }201 in >> input_array_size;202 in >> hidden_array_size;203 in >> output_array_size;204 in >> learning_rate;205 in >> number_of_input_patterns;206 bias_array_size = hidden_array_size + output_array_size;207 initialize_net();208 for(x = 0; x < bias_array_size; x++) in >> bias[x];209 for(x=0; x<input_array_size; x++) { 210 for(y=0; y<hidden_array_size; y++) in >> weight_i_h[x][y];211 }212 for(x = 0; x < hidden_array_size; x++) { 213 for(y=0; y<output_array_size; y++) in >> weight_h_o[x][y];214 }215 for(x=0; x < number_of_input_patterns; x++) {216 for(y=0; y<input_array_size; y++) in >> input[x][y];217 }218 for(x=0; x < number_of_input_patterns; x++) {219 for(y=0; y<output_array_size; y++) in >> target[x][y];220 }221 in.close();222 cout << endl << "data loaded" << endl;223 return;224 }225 226 227 void forward_pass(int pattern)228 {229 _control87(MCW_EM, MCW_EM);230 register double temp=0;231 register int x,y;232 233 // INPUT -> HIDDEN234 for(y=0; y<hidden_array_size; y++) {235 for(x=0; x<input_array_size; x++) {236 temp += (input[pattern][x] * weight_i_h[x][y]);237 }238 hidden[y] = (1.0 / (1.0 + exp(-1.0 * (temp + bias[y]))));239 temp = 0;240 }241 242 // HIDDEN -> OUTPUT243 for(y=0; y<output_array_size; y++) {244 for(x=0; x<hidden_array_size; x++) {245 temp += (hidden[x] * weight_h_o[x][y]);246 }247 output[pattern][y] = (1.0 / (1.0 + exp(-1.0 * (temp + bias[y + hidden_array_size]))));248 temp = 0;249 }250 return;251 }252 253 254 255 void backward_pass(int pattern)256 {257 register int x, y;258 register double temp = 0;259 260 // COMPUTE ERRORSIGNAL FOR OUTPUT UNITS261 for(x=0; x<output_array_size; x++) {262 errorsignal_output[x] = (target[pattern][x] - output[pattern][x]);263 }264 265 // COMPUTE ERRORSIGNAL FOR HIDDEN UNITS266 for(x=0; x<hidden_array_size; x++) {267 for(y=0; y<output_array_size; y++) { 268 temp += (errorsignal_output[y] * weight_h_o[x][y]);269 }270 errorsignal_hidden[x] = hidden[x] * (1-hidden[x]) * temp;271 temp = 0.0;272 }273 274 // ADJUST WEIGHTS OF CONNECTIONS FROM HIDDEN TO OUTPUT UNITS275 double length = 0.0;276 for (x=0; x<hidden_array_size; x++) {277 length += hidden[x]*hidden[x];278 }279 if (length<=0.1) length = 0.1;280 for(x=0; x<hidden_array_size; x++) {281 for(y=0; y<output_array_size; y++) {282 weight_h_o[x][y] += (learning_rate * errorsignal_output[y] * 283 hidden[x]/length);284 }285 }286 287 // ADJUST BIASES OF HIDDEN UNITS288 for(x=hidden_array_size; x<bias_array_size; x++) {289 bias[x] += (learning_rate * errorsignal_output[x] / length);290 }291 292 // ADJUST WEIGHTS OF CONNECTIONS FROM INPUT TO HIDDEN UNITS293 length = 0.0;294 for (x=0; x<input_array_size; x++) {295 length += input[pattern][x]*input[pattern][x];296 }297 if (length<=0.1) length = 0.1;298 for(x=0; x<input_array_size; x++) {299 for(y=0; y<hidden_array_size; y++) {300 weight_i_h[x][y] += (learning_rate * errorsignal_hidden[y] * 301 input[pattern][x]/length);302 }303 }304 305 // ADJUST BIASES FOR OUTPUT UNITS306 for(x=0; x<hidden_array_size; x++) {307 bias[x] += (learning_rate * errorsignal_hidden[x] / length);308 }309 return;310 }311 312 int compare_output_to_target()313 {314 register int y,z;315 register double temp, error = 0.0;316 temp = target[ytemp][ztemp] - output[ytemp][ztemp];317 if (temp < 0) error -= temp;318 else error += temp;319 if(error > max_error_tollerance) return 0;320 error = 0.0;321 for(y=0; y < number_of_input_patterns; y++) {322 for(z=0; z < output_array_size; z++) {323 temp = target[y][z] - output[y][z];324 if (temp < 0) error -= temp;325 else error += temp;326 if(error > max_error_tollerance) {327 ytemp = y;328 ztemp = z;329 return 0;330 }331 error = 0.0;332 }333 }334 return 1;335 }336 337 void save_data(char *argres) {338 int x, y;339 ofstream out; 340 out.open(argres);341 if(!out) { cout << endl << "failed to save file" << endl; return; }342 out << input_array_size << endl;343 out << hidden_array_size << endl;344 out << output_array_size << endl;345 out << learning_rate << endl;346 out << number_of_input_patterns << endl << endl;347 for(x=0; x<bias_array_size; x++) out << bias[x] << ‘ ‘;348 out << endl << endl;349 for(x=0; x<input_array_size; x++) {350 for(y=0; y<hidden_array_size; y++) out << weight_i_h[x][y] << ‘ ‘;351 }352 out << endl << endl;353 for(x=0; x<hidden_array_size; x++) {354 for(y=0; y<output_array_size; y++) out << weight_h_o[x][y] << ‘ ‘;355 }356 out << endl << endl;357 for(x=0; x<number_of_input_patterns; x++) {358 for(y=0; y<input_array_size; y++) out << input[x][y] << ‘ ‘;359 out << endl;360 }361 out << endl;362 for(x=0; x<number_of_input_patterns; x++) {363 for(y=0; y<output_array_size; y++) out << target[x][y] << ‘ ‘;364 out << endl;365 }366 out.close();367 cout << endl << "data saved" << endl;368 return;369 } 370 371 void make()372 {373 int x, y, z;374 double inpx, bias_array_size, input_array_size, hidden_array_size, output_array_size;375 char makefilename[128];376 cout << endl << "enter name of new data file: ";377 cin >> makefilename;378 ofstream out;379 out.open(makefilename);380 if(!out) { cout << endl << "failed to open file" << endl; return;}381 cout << "how many input units? ";382 cin >> input_array_size;383 out << input_array_size << endl;384 cout << "how many hidden units? ";385 cin >> hidden_array_size;386 out << hidden_array_size << endl;387 cout << "how many output units? ";388 cin >> output_array_size;389 out << output_array_size << endl;390 bias_array_size = hidden_array_size + output_array_size;391 cout << endl << "Learning rate: ";392 cin >> inpx;393 out << inpx << endl;394 cout << endl << "Number of input patterns: ";395 cin >> z;396 out << z << endl << endl;397 for(x=0; x<bias_array_size; x++) out << (1.0 - (2.0 * bedlam((long*)(gaset)))) << ‘ ‘;398 out << endl << endl;399 for(x=0; x<input_array_size; x++) {400 for(y=0; y<hidden_array_size; y++) out << (1.0 - (2.0 * bedlam((long*)(gaset)))) << ‘ ‘;401 }402 out << endl << endl;403 for(x=0; x<hidden_array_size; x++) {404 for(y=0; y<output_array_size; y++) out << (1.0 - (2.0 * bedlam((long*)(gaset)))) << ‘ ‘;405 }406 out << endl << endl;407 for(x=0; x < z; x++) {408 cout << endl << "input pattern " << (x + 1) << endl;409 for(y=0; y<input_array_size; y++) {410 cout << (y+1) << ": ";411 cin >> inpx;412 out << inpx << ‘ ‘;413 }414 out << endl;415 }416 out << endl;417 for(x=0; x < z; x++) {418 cout << endl << "target output pattern " << (x+1) << endl;419 for(y=0; y<output_array_size; y++) {420 cout << (y+1) << ": ";421 cin >> inpx;422 out << inpx << ‘ ‘;423 }424 out << endl;425 }426 out.close();427 cout << endl << "data saved, to work with this new data file you first have to load it" << endl;428 return;429 }430 431 float bedlam(long *idum)432 {433 int xj;434 long xk;435 static long iy=0;436 static long iv[NTAB];437 float temp;438 439 if(*idum <= 0 || !iy)440 {441 if(-(*idum) < 1)442 {443 *idum = 1 + *idum;444 }445 else446 {447 *idum = -(*idum);448 }449 for(xj = NTAB+7; xj >= 0; xj--)450 {451 xk = (*idum) / IQ;452 *idum = IA * (*idum - xk * IQ) - IR * xk;453 if(*idum < 0)454 {455 *idum += IM;456 }457 if(xj < NTAB)458 {459 iv[xj] = *idum;460 }461 }462 iy = iv[0];463 }464 465 xk = (*idum) / IQ;466 *idum = IA * (*idum - xk * IQ) - IR * xk;467 if(*idum < 0)468 {469 *idum += IM;470 }471 xj = iy / NDIV;472 iy = iv[xj];473 iv[xj] = *idum;474 475 if((temp=AM*iy) > RNMX)476 {477 return(RNMX);478 }479 else480 {481 return(temp);482 }483 }484 485 void test()486 {487 pattern = 0;488 while(pattern == 0) {489 cout << endl << endl << "There are " << number_of_input_patterns << " input patterns in the file," << endl << "enter a number within this range: ";490 pattern = getnumber();491 }492 pattern--;493 forward_pass(pattern);494 output_to_screen();495 return;496 }497 498 void output_to_screen()499 {500 int x;501 cout << endl << "Output pattern:" << endl;502 for(x=0; x<output_array_size; x++) {503 cout << endl << (x+1) << ": " << output[pattern][x] << " binary: ";504 if(output[pattern][x] >= 0.9) cout << "1";505 else if(output[pattern][x]<=0.1) cout << "0";506 else cout << "intermediate value";507 }508 cout << endl;509 return;510 }511 512 int getnumber()513 {514 int a, b = 0;515 char c, d[5];516 while(b<4) {517 do { c = getch(); } while (c != ‘1‘ && c != ‘2‘ && c != ‘3‘ && c != ‘4‘ && c != ‘5‘ && c != ‘6‘ && c != ‘7‘ && c != ‘8‘ && c != ‘9‘ && c != ‘0‘ && toascii(c) != 13);518 if(toascii(c)==13) break;519 if(toascii(c)==27) return 0;520 d[b] = c;521 cout << c;522 b++;523 }524 d[b] = ‘\0‘;525 a = atoi(d);526 if(a < 0 || a > number_of_input_patterns) a = 0;527 return a;528 }529 530 void get_file_name()531 {532 cout << endl << "enter name of file to load: ";533 cin >> filename;534 return;535 }536 537 void print_data()538 {539 char choice;540 if (file_loaded == 0)541 {542 cout << endl543 << "there is no data loaded into memory"544 << endl;545 return;546 }547 cout << endl << "1. print data to screen" << endl;548 cout << "2. print data to file" << endl;549 cout << "3. return to main menu" << endl << endl;550 cout << "Enter your choice (1-3)" << endl;551 do { choice = getch(); } while (choice != ‘1‘ && choice != ‘2‘ && choice != ‘3‘);552 switch(choice) {553 case ‘1‘: print_data_to_screen();554 break;555 case ‘2‘: print_data_to_file();556 break;557 case ‘3‘: return;558 };559 return;560 }561 562 563 void print_data_to_screen() {564 register int x, y;565 cout << endl << endl << "DATA FILE: " << filename << endl;566 cout << "learning rate: " << learning_rate << endl;567 cout << "input units: " << input_array_size << endl;568 cout << "hidden units: " << hidden_array_size << endl;569 cout << "output units: " << output_array_size << endl;570 cout << "number of input and target output patterns: " << number_of_input_patterns << endl << endl;571 cout << "INPUT AND TARGET OUTPUT PATTERNS:";572 for(x=0; x<number_of_input_patterns; x++) {573 cout << endl << "input pattern: " << (x+1) << endl;574 for(y=0; y<input_array_size; y++) cout << input[x][y] << " ";575 cout << endl << "target output pattern: " << (x+1) << endl;576 for(y=0; y<output_array_size; y++) cout << target[x][y] << " ";577 }578 cout << endl << endl << "BIASES:" << endl;579 for(x=0; x<hidden_array_size; x++) {580 cout << "bias of hidden unit " << (x+1) << ": " << bias[x];581 if(x<output_array_size) cout << " bias of output unit " << (x+1) << ": " << bias[x+hidden_array_size];582 cout << endl;583 }584 cout << endl << "WEIGHTS:" << endl;585 for(x=0; x<input_array_size; x++) {586 for(y=0; y<hidden_array_size; y++) cout << "i_h[" << x << "][" << y << "]: " << weight_i_h[x][y] << endl;587 }588 for(x=0; x<hidden_array_size; x++) {589 for(y=0; y<output_array_size; y++) cout << "h_o[" << x << "][" << y << "]: " << weight_h_o[x][y] << endl;590 }591 return;592 }593 594 void print_data_to_file()595 {596 char printfile[128];597 cout << endl << "enter name of file to print data to: ";598 cin >> printfile;599 ofstream out;600 out.open(printfile);601 if(!out) { cout << endl << "failed to open file"; return; }602 register int x, y;603 out << endl << endl << "DATA FILE: " << filename << endl;604 out << "input units: " << input_array_size << endl;605 out << "hidden units: " << hidden_array_size << endl;606 out << "output units: " << output_array_size << endl;607 out << "learning rate: " << learning_rate << endl;608 out << "number of input and target output patterns: " << number_of_input_patterns << endl << endl;609 out << "INPUT AND TARGET OUTPUT PATTERNS:";610 for(x=0; x<number_of_input_patterns; x++) {611 out << endl << "input pattern: " << (x+1) << endl;612 for(y=0; y<input_array_size; y++) out << input[x][y] << " ";613 out << endl << "target output pattern: " << (x+1) << endl;614 for(y=0; y<output_array_size; y++) out << target[x][y] << " ";615 }616 out << endl << endl << "BIASES:" << endl;617 for(x=0; x<hidden_array_size; x++) {618 out << "bias of hidden unit " << (x+1) << ": " << bias[x];619 if(x<output_array_size) out << " bias of output unit " << (x+1) << ": " << bias[x+hidden_array_size];620 out << endl;621 }622 out << endl << "WEIGHTS:" << endl;623 for(x=0; x<input_array_size; x++) {624 for(y=0; y<hidden_array_size; y++) out << "i_h[" << x << "][" << y << "]: " << weight_i_h[x][y] << endl;625 }626 for(x=0; x<hidden_array_size; x++) {627 for(y=0; y<output_array_size; y++) out << "h_o[" << x << "][" << y << "]: " << weight_h_o[x][y] << endl;628 }629 out.close();630 cout << endl << "data has been printed to " << printfile << endl;631 return;632 }633 634 void change_learning_rate()635 {636 if (file_loaded == 0)637 {638 cout << endl639 << "there is no data loaded into memory"640 << endl;641 return;642 }643 cout << endl << "actual learning rate: " << learning_rate << " new value: ";644 cin >> learning_rate;645 return;646 }647 648 void compute_output_pattern()649 {650 if (file_loaded == 0)651 {652 cout << endl653 << "there is no data loaded into memory"654 << endl;655 return;656 }657 char choice;658 cout << endl << endl << "1. load trained input pattern into network" << endl;659 cout << "2. load custom input pattern into network" << endl;660 cout << "3. go back to main menu" << endl << endl;661 cout << "Enter your choice (1-3)" << endl;662 do { choice = getch(); } while (choice != ‘1‘ && choice != ‘2‘ && choice != ‘3‘);663 switch(choice) {664 case ‘1‘: test();665 break;666 case ‘2‘: custom();667 break;668 case ‘3‘: return;669 };670 }671 672 void custom()673 {674 _control87 (MCW_EM, MCW_EM);675 char filename[128];676 register double temp=0;677 register int x,y;678 double *custom_input = new double [input_array_size];679 if(!custom_input)680 {681 cout << endl << "memory problem!";682 return;683 }684 double *custom_output = new double [output_array_size];685 if(!custom_output)686 {687 delete [] custom_input;688 cout << endl << "memory problem!";689 return;690 }691 cout << endl << endl << "enter file that contains test input pattern: ";692 cin >> filename;693 ifstream in(filename);694 if(!in) { cout << endl << "failed to load data file" << endl; return; }695 for(x = 0; x < input_array_size; x++) {696 in >> custom_input[x];697 }698 for(y=0; y<hidden_array_size; y++) {699 for(x=0; x<input_array_size; x++) {700 temp += (custom_input[x] * weight_i_h[x][y]);701 }702 hidden[y] = (1.0 / (1.0 + exp(-1.0 * (temp + bias[y]))));703 temp = 0;704 }705 for(y=0; y<output_array_size; y++) {706 for(x=0; x<hidden_array_size; x++) {707 temp += (hidden[x] * weight_h_o[x][y]);708 }709 custom_output[y] = (1.0 / (1.0 + exp(-1.0 * (temp + bias[y + hidden_array_size]))));710 temp = 0;711 }712 cout << endl << "Input pattern:" << endl;713 for(x = 0; x < input_array_size; x++) {714 cout << "[" << (x + 1) << ": " << custom_input[x] << "] ";715 }716 cout << endl << endl << "Output pattern:";717 for(x=0; x<output_array_size; x++) {718 cout << endl << (x+1) << ": " << custom_output[x] << " binary: ";719 if(custom_output[x] >= 0.9) cout << "1";720 else if(custom_output[x]<=0.1) cout << "0";721 else cout << "intermediate value";722 }723 cout << endl;724 delete [] custom_input;725 delete [] custom_output;726 return;727 }728 729 void clear_memory()730 {731 int x;732 for(x=0; x<number_of_input_patterns; x++)733 {734 delete [] input[x];735 }736 delete [] input;737 delete [] hidden;738 for(x=0; x<number_of_input_patterns; x++)739 {740 delete [] output[x];741 }742 delete [] output;743 for(x=0; x<number_of_input_patterns; x++)744 {745 delete [] target[x];746 }747 delete [] target;748 delete [] bias;749 for(x=0; x<input_array_size; x++)750 {751 delete [] weight_i_h[x];752 }753 delete [] weight_i_h;754 for(x=0; x<hidden_array_size; x++)755 {756 delete [] weight_h_o[x];757 }758 delete [] weight_h_o;759 delete [] errorsignal_hidden;760 delete [] errorsignal_output;761 file_loaded = 0;762 return;763 }
初始化的神经网络的数据文件:
2340.545.747781 -6.045236 1.206744 -41.245163 -0.249886 -0.35452 0.0718 -8.446443 9.25553 -6.50087 7.357942 7.777944 1.238442 15.957281 0.452741 -8.19198 9.140881 29.124746 9.806898 5.859479 -5.09182 -3.475694 -4.896269 6.320669 0.213897 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!explanation of datafile. Can be deleted. Not necessary for network to work!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2 (number of input units)3 (number of hidden units)4 (number of output units)0.5 (learning rate)4 (number of input and target output patterns) (has to correspond to the amount of patterns at the end of the datafile)5.747781 -6.045236 1.206744 -41.245163 -0.249886 -0.35452 0.0718 (biases of hidden and output units, first three are biases of the hidden units, last four are biases of the output units)-8.446443 9.25553 -6.50087 7.357942 7.777944 1.238442 (values of weights from input to hidden units)15.957281 0.452741 -8.19198 9.140881 29.124746 9.806898 5.859479 -5.09182 -3.475694 -4.896269 6.320669 0.213897 (values of weights from hidden to output units)1 1 (input pattern #1)1 0 (input pattern #2)0 1 (input pattern #3)0 0 (input pattern #4)1 1 0 1 (target output pattern #1)0 1 1 0 (target output pattern #2)0 1 1 1 (target output pattern #3) 0 0 0 1 (target output pattern #4) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! end of explanation of datafile. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
按照数据输入说明,可以再b.txt文件中保存输入数据[0, 1],对应的输入结果如下:
可以看到,输入[0,1]得到的结果为0110,与训练时候的结果一直。
最后,本代码没有深入测试过,同时也只有一个隐层,所以建议只用来配合梳理算法原理用。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。