Advertisement
Guest User

Untitled

a guest
Nov 20th, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5.  
  6. #define NumHidden 6
  7. #define NumInput 2
  8.  
  9. double trainVal[1000][3];
  10.  
  11. int valCount;
  12.  
  13. double wInHid[NumInput+1][NumHidden+1] = {{0}};
  14. double wHidOut[NumHidden+1] = {0};
  15.  
  16. double xmax = 0;
  17. double ymax = 0;
  18.  
  19. double eta = 0.0009;
  20.  
  21. int debugMode = 0;
  22.  
  23. void normalize(){
  24.     for(int i = 0; i < valCount; i++)
  25.     {
  26.         if(fabs(trainVal[i][0]) > xmax)
  27.         {
  28.             xmax = fabs(trainVal[i][0]);
  29.         }
  30.  
  31.         if(fabs(trainVal[i][1]) > ymax)
  32.         {
  33.             ymax = fabs(trainVal[i][1]);
  34.         }
  35.     }
  36.  
  37.     for(int i = 0; i < valCount; i++)
  38.     {
  39.         trainVal[i][0] = trainVal[i][0]/xmax;
  40.         trainVal[i][1] = trainVal[i][1]/ymax;
  41.     }
  42.  
  43. }
  44.  
  45. void train(){
  46.     double error = 100;
  47.     double deltaO = 0;
  48.  
  49.     double hidden[NumHidden+1];
  50.     double output = 0;
  51.  
  52.     double deltaH [NumHidden + 1] = {0};
  53.     double deltaWeightInHid[NumInput + 1][NumHidden + 1];
  54.     double deltaWeightHidOut[NumHidden + 1];
  55.  
  56.     double sumHid[NumHidden+1];
  57.     double sumOut;
  58.     double sumDOW[NumHidden + 1];
  59.  
  60.     normalize();
  61.  
  62.     int classificationError = 1;
  63.  
  64.     while(error>0.1)
  65.     {
  66.         if(debugMode) printf("%f\n", error);
  67.  
  68.         error = 0;
  69.  
  70.         classificationError = 0;
  71.  
  72.         for(int p = 1 ; p <= valCount ; p++ )           /* repeat for all the training patterns */
  73.         {
  74.  
  75.             /* compute hidden unit activations */
  76.  
  77.             for(int j = 1 ; j <= NumHidden ; j++ )
  78.             {
  79.                 sumHid[j] = wInHid[0][j] ;
  80.  
  81.                 for(int i = 1 ; i <= NumInput ; i++ )
  82.                 {
  83.                     sumHid[j] += trainVal[p][i-1] * wInHid[i][j] ;
  84.                 }
  85.  
  86.                 hidden[j] = tanh(sumHid[j]);
  87.             }
  88.  
  89.             sumOut = wHidOut[0] ;
  90.  
  91.             for(int j = 1 ; j <= NumHidden ; j++ )
  92.             {
  93.                 sumOut += hidden[j] * wHidOut[j] ;
  94.             }
  95.  
  96.             output = tanh(sumOut);
  97.             error += (output - trainVal[p][2])*(output - trainVal[p][2]);
  98.  
  99.             if((output > 0 && trainVal[p][2]<0) && (output < 0 && trainVal[p][2]>0)) classificationError=1;
  100.  
  101.             deltaO = 2*(trainVal[p][2]-output);
  102.  
  103.             /* 'back-propagate' errors to hidden layer */
  104.             for(int j = 1 ; j <= NumHidden ; j++ )
  105.             {
  106.                 sumDOW[j] = wHidOut[j] * deltaO;
  107.                 deltaH[j] = sumDOW[j] *  (1.0 - hidden[j] * hidden[j]) ;
  108.             }
  109.  
  110.             for(int j = 1 ; j <= NumHidden ; j++ )           /* update weights wInHid */
  111.             {
  112.                 deltaWeightInHid[0][j] = eta * deltaH[j];
  113.                 wInHid[0][j] += deltaWeightInHid[0][j] ;
  114.  
  115.                 for(int i = 1 ; i <= NumInput ; i++ )
  116.                 {
  117.                     deltaWeightInHid[i][j] = eta * trainVal[p][i-1] * deltaH[j];
  118.                     wInHid[i][j] += deltaWeightInHid[i][j] ;
  119.                 }
  120.  
  121.             }
  122.  
  123.             /* update weights WeightHO */
  124.             deltaWeightHidOut[0] = eta * deltaO;
  125.             wHidOut[0] += deltaWeightHidOut[0] ;
  126.  
  127.             for(int j = 1 ; j <= NumHidden ; j++ )
  128.             {
  129.                 deltaWeightHidOut[j] = eta * hidden[j] * deltaO;
  130.                 wHidOut[j] += deltaWeightHidOut[j] ;
  131.  
  132.             }
  133.         }
  134.     }
  135. }
  136.  
  137.  
  138. int main()
  139.  
  140. {
  141.     int c, j, k;
  142.     double functionOutput;
  143.     double x = 0, y = 0;
  144.     int trainingFinished = 0;
  145.     int trainingDataEnd = 0;
  146.  
  147.     double sumHid[NumHidden + 1] = {0};
  148.     double hidden[NumHidden + 1] = {0};
  149.     double sumOut = 0;
  150.     double output = 0;
  151.  
  152.     srand(time(NULL));
  153.  
  154.     c  = j = valCount = functionOutput =0;
  155.  
  156.     /***Weight initalisation****/
  157.     for(int i = 1; i <= NumHidden; i++)
  158.     {
  159.         for(int j = 0; j <= NumInput; j++)
  160.         {
  161.             wInHid[i][j] = (rand() % 10)/1000.0;;
  162.             if(debugMode) printf("%f\n", wInHid[i][j]);
  163.         }
  164.     }
  165.  
  166.     for(int i = 0; i <= NumHidden; i++)
  167.     {
  168.         wHidOut[i] = (rand() % 10)/1000.0;;
  169.         if(debugMode) printf("%f\n", wHidOut[i]);
  170.     }
  171.  
  172.     for(j = 0; j<1000; j++)
  173.     {
  174.         for(k = 0; k<3; k++)
  175.             trainVal[j][k]=0;
  176.     }
  177.  
  178.  
  179.     if(debugMode)
  180.     {
  181.         FILE * pFile;
  182.         pFile = fopen ("/home/vincent/NetTestC.txt","r");
  183.  
  184.         valCount=0;
  185.  
  186.         while(1)
  187.         {
  188.             fscanf(pFile, "%lf,%lf,%lf\n", &trainVal[valCount][0], &trainVal[valCount][1],&trainVal[valCount][2]);
  189.  
  190.             printf("%f,%f,%f\n",trainVal[valCount][0], trainVal[valCount][1],trainVal[valCount][2]);
  191.  
  192.             if(trainVal[valCount][2]==0) break;
  193.  
  194.             valCount++;
  195.         }
  196.  
  197.         trainingFinished=1;
  198.         rewind(pFile);
  199.  
  200.         train();
  201.  
  202.         while(1)
  203.         {
  204.             double z = 0;
  205.  
  206.             if(trainingDataEnd)
  207.             {
  208.                 c=fscanf(pFile, "%lf,%lf\n", &x, &y);
  209.  
  210.                 x/=xmax;
  211.                 y/=ymax;
  212.  
  213.                 if(c==-1) break;
  214.  
  215.                 for( j = 1 ; j <= NumHidden ; j++ )
  216.                 {
  217.                     sumHid[j] = wInHid[0][j] ;
  218.  
  219.                     sumHid[j] += x * wInHid[1][j] ;
  220.                     sumHid[j] += y * wInHid[2][j] ;
  221.  
  222.                     hidden[j] = tanh(sumHid[j]);
  223.                 }
  224.  
  225.                 sumOut = wHidOut[0] ;
  226.  
  227.                 for( j = 1 ; j <= NumHidden ; j++ )
  228.                 {
  229.                     sumOut += hidden[j-1] * wHidOut[j] ;
  230.                 }
  231.  
  232.                 output = tanh(sumOut);
  233.  
  234.                 if(output>0) printf("+1\n");
  235.                 else printf("-1\n");
  236.             } else
  237.                 fscanf(pFile, "%lf,%lf,%lf\n", &x, &y, &z);
  238.  
  239.             if(z==0) trainingDataEnd=1;
  240.  
  241.         }
  242.     }else {
  243.  
  244.     while(c!=-1)
  245.     {
  246.             if(!trainingFinished)
  247.             {
  248.                 c = scanf("%lf,%lf,%lf\n", &trainVal[valCount][0], &trainVal[valCount][1], &trainVal[valCount][2]);
  249.  
  250.                 if(trainVal[valCount][2] == 0)
  251.                 {
  252.                     train();
  253.                     trainingFinished = 1;
  254.                 }
  255.                 else
  256.                 {
  257.                     valCount++;
  258.                 }
  259.             } else {
  260.                 x = y = 0;
  261.  
  262.                 c = scanf("%lf,%lf\n", &x, &y);
  263.  
  264.                 x/=xmax;
  265.                 y/=ymax;
  266.  
  267.                 if(c == -1) break;
  268.  
  269.                 for( j = 1 ; j <= NumHidden ; j++ )           /* compute hidden unit activations */
  270.                 {
  271.                     sumHid[j] = wInHid[0][j] ;
  272.  
  273.                     sumHid[j] += x * wInHid[1][j] ;
  274.                     sumHid[j] += y * wInHid[2][j] ;
  275.  
  276.                     hidden[j] = tanh(sumHid[j]);
  277.                 }
  278.  
  279.                 sumOut = wHidOut[0] ;
  280.  
  281.                 for( j = 1 ; j <= NumHidden ; j++ )
  282.                 {
  283.                     sumOut += hidden[j] * wHidOut[j] ;
  284.                 }
  285.  
  286.                 output = tanh(sumOut);
  287.  
  288.                 if(output>0) printf("+1\n");
  289.                 else printf("-1\n");
  290.  
  291.             }
  292.         }
  293.     }
  294.  
  295.     return 0;
  296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement