首页 > 代码库 > 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,与训练时候的结果一直。

最后,本代码没有深入测试过,同时也只有一个隐层,所以建议只用来配合梳理算法原理用。