zoukankan      html  css  js  c++  java
  • 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 << endl
    104                         << "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 << endl
    176             << "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 -> HIDDEN
    234     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 -> OUTPUT
    243     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 UNITS
    261     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 UNITS
    266     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 UNITS
    275     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 UNITS
    288     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 UNITS
    293     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 UNITS
    306     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         else
    446         {
    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     else
    480     {
    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] = '';
    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 << endl
    543             << "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 << endl
    639             << "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 << endl
    653             << "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 }

    初始化的神经网络的数据文件:

    2
    3
    4
    0.5
    4
    5.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,与训练时候的结果一直。

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

  • 相关阅读:
    DotNetNuke 5 C#版本解读之1--架构介绍
    关于加入外包公司
    《深入浅出WPF》视频列表
    倒序输出字符串
    C#基础—— check、lock、using语句归纳
    Asp.net页面之间传递参数的几种方法
    sual C#中编写多线程程序之起步
    Head.First.ObjectOriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
    索引分类
    表单提交中Get和Post方式的区别
  • 原文地址:https://www.cnblogs.com/zhxfl/p/3841746.html
Copyright © 2011-2022 走看看