Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.58 KB | None | 0 0
  1. //
  2. //  main.c
  3. //  H2_2
  4. //
  5. //  Created by Ulrich Ziegler on 02.12.17.
  6. //  Copyright © 2017 Ulrich Ziegler. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <math.h>
  12. #include <stdlib.h>
  13.  
  14.  
  15. //----------- GLOBAL VARIABLES----------------------
  16.  
  17. double training[1000][3] = {{0}};
  18. double data[1000][2] = {{0}};
  19.  
  20. double weight1[4][3] = {{0}};
  21. double weight2[4][5] = {{0}};
  22. double weight3[4][5] = {{0}};
  23. double weight_o[5] = {0};
  24.  
  25. double output1[5] = {0};
  26. double output2[5] = {0};
  27. double output3[5] = {0};
  28. double output_o = 0;
  29.  
  30. double error_i[2] = {0};
  31. double error1[4] = {0};
  32. double error2[4] = {0};
  33. double error3[4] = {0};
  34. double error_o = 0;
  35.  
  36. double d_weight1[4][3] = {{0}};
  37. double d_weight2[4][5] = {{0}};
  38. double d_weight3[4][5] = {{0}};
  39. double d_weight_o[5] = {0};
  40.  
  41.  
  42. //*******************************************************************************************
  43. void random_weights(){
  44.     double value = 0.4;
  45.    
  46.     for(int i = 0; i < 4; i++){
  47.         for(int j = 0; j < 3; j++){
  48.            
  49.             weight1[i][j] = ((double)rand()/(double)(RAND_MAX)) * value;
  50.            
  51.             if(i == 0 && j == 0){
  52.                 weight1[i][j] += 0.001;
  53.             }
  54.            
  55.             if((i + j) % 2 == 0){
  56.                 weight1[i][j] = -1 * weight1[i][j];
  57.             }
  58.         }
  59.     }
  60.    
  61.     for(int i = 0; i < 4; i++){
  62.         for(int j = 0; j < 5; j++){
  63.            
  64.             weight2[i][j] = ((double)rand()/(double)(RAND_MAX)) * value;
  65.            
  66.             if(i == 0 && j == 0){
  67.                 weight2[i][j] += 0.001;
  68.             }
  69.            
  70.             if((i + j) % 2 == 0){
  71.                 weight2[i][j] = -1 * weight2[i][j];
  72.             }
  73.         }
  74.     }
  75.    
  76.     for(int i = 0; i < 4; i++){
  77.         for(int j = 0; j < 5; j++){
  78.            
  79.             weight3[i][j] = ((double)rand()/(double)(RAND_MAX)) * value;
  80.            
  81.             if(i == 0 && j == 0){
  82.                 weight3[i][j] += 0.001;
  83.             }
  84.            
  85.             if((i + j) % 2 == 0){
  86.                 weight3[i][j] = -1 * weight3[i][j];
  87.             }
  88.         }
  89.     }
  90.    
  91.    
  92.     for(int i = 0; i < 5; i++){
  93.        
  94.         weight_o[i] = ((double)rand()/(double)(RAND_MAX)) * value;
  95.        
  96.         if(i == 0){
  97.             weight_o[i] += 0.001;
  98.         }
  99.        
  100.         if(i % 2 == 0){
  101.             weight_o[i] = -1 * weight_o[i];
  102.         }
  103.     }
  104. }
  105.  
  106.  
  107. //*******************************************************************************************
  108. void input(int* counter_t, int* counter_d){
  109.    
  110.     int i = 0;
  111.     int j = 0;
  112.    
  113.     while(scanf("%lf,%lf,%lf", &training[i][0], &training[i][1], &training[i][2]))
  114.     {
  115.         if(training[i][0] == 0.0 && training[i][1] == 0.0 && training[i][2] == 0.0){
  116.             break;
  117.         }
  118.        
  119.         else{
  120.             i++;
  121.         }
  122.     }
  123.    
  124.     while(scanf("%lf,%lf", &data[j][0], &data[j][1]) != EOF)
  125.     {
  126.         j++;
  127.     }
  128.    
  129.     *counter_t=i;
  130.     *counter_d=j;
  131.    
  132. }
  133.  
  134.  
  135. //*******************************************************************************************
  136. void maximum(int* counter_t, int* counter_d, double* max_x, double* max_y){
  137.    
  138.     int i = 0;
  139.     int j = 0;
  140.    
  141.     while(i < *counter_t){
  142.         if(fabs(training[i][0])> *max_x){
  143.             *max_x=fabs(training[i][0]);}
  144.         if(fabs(training[i][1])> *max_y){
  145.             *max_y=fabs(training[i][1]);}
  146.         i++;
  147.     }
  148.    
  149.     while(j < *counter_d){
  150.         if(fabs(data[j][0])> *max_x){
  151.             *max_x=fabs(data[j][0]);}
  152.         if(fabs(data[j][1])> *max_y){
  153.             *max_y=fabs(data[j][1]);}
  154.         j++;
  155.     }
  156.    
  157. }
  158.  
  159.  
  160. //*******************************************************************************************
  161. void scale_matrix(int* counter_t, int* counter_d, double* max_x, double* max_y){
  162.    
  163.     for(int i = 0; i < *counter_t; i++){
  164.         training[i][0]/=*max_x;
  165.         training[i][1]/=*max_y;
  166.     }
  167.    
  168.     for(int j = 0; j < *counter_d; j++){
  169.         data[j][0]/=*max_x;
  170.         data[j][1]/=*max_y;
  171.     }
  172. }
  173.  
  174.  
  175. //*******************************************************************************************
  176. void output(int iterator){
  177.    
  178.     double buffer[3] = {training[iterator][0], training[iterator][1], 1};
  179.    
  180.     for (int i = 0; i < 4; i++)
  181.     {
  182.         double sum = 0;
  183.         for (int j = 0; j < 3; j++)
  184.         {
  185.             sum += buffer[j] * weight1[i][j];
  186.         }
  187.         output1[i] = tanh(sum);
  188.     }
  189.     output1[4]=1;   //bias
  190.    
  191.    
  192.     for (int i = 0; i < 4; i++)
  193.     {
  194.         double sum = 0;
  195.         for (int j = 0; j < 5; j++)
  196.         {
  197.             sum += output1[j] * weight2[i][j];
  198.         }
  199.         output2[i] = tanh(sum);
  200.     }
  201.     output2[4]=1;   //bias;
  202.    
  203.    
  204.     for (int i = 0; i < 4; i++)
  205.     {
  206.         double sum = 0;
  207.         for (int j = 0; j < 5; j++)
  208.         {
  209.             sum += output2[j] * weight3[i][j];
  210.         }
  211.         output3[i] = tanh(sum);
  212.     }
  213.     output3[4]=1;   //bias;
  214.    
  215.    
  216.     double sum = 0;
  217.     for (int i = 0; i < 5; i++)
  218.     {
  219.         sum += output3[i] * weight_o[i];
  220.     }
  221.     output_o = tanh(sum);
  222. }
  223.  
  224.  
  225. //*******************************************************************************************
  226. void error(int iterator){
  227.    
  228.     error_o = 2*(training[iterator][2]-output_o)*(1 - output_o * output_o);
  229.    
  230.     for(int i = 0; i < 4; i++){
  231.         error3[i]=error_o*weight_o[i]*(1 - output3[i] * output3[i]);
  232.     }
  233.                                      
  234.     for(int j = 0; j < 4; j++){
  235.        
  236.         error2[j]=0;
  237.        
  238.         for(int i = 0; i < 4; i++){
  239.             error2[j]+=error3[i]*weight3[i][j]*(1-output2[j]*output2[j]);
  240.         }
  241.     }
  242.    
  243.    
  244.     for(int j = 0; j < 4; j++){
  245.        
  246.         error1[j]=0;
  247.        
  248.         for(int i = 0; i < 4; i++){
  249.             error1[j]+=error2[i]*weight2[i][j]*(1-output1[j]*output1[j]);
  250.         }
  251.     }
  252.    
  253.     for(int j = 0; j < 2; j++){
  254.        
  255.         error_i[j]=0;
  256.        
  257.         for(int i = 0; i < 4; i++){
  258.             error_i[j]+=error1[i]*weight1[i][j]*(1- training[iterator][j] * training[iterator][j]);
  259.         }
  260.     }
  261. }
  262.  
  263.  
  264. //*******************************************************************************************
  265. void weight_change(int iterator, double learning_rate){
  266.    
  267.     for(int i = 0; i < 4; i++){
  268.         d_weight_o[i] += learning_rate*error_o*output3[i];
  269.     }
  270.     d_weight_o[4] += learning_rate*error_o;
  271.    
  272.    
  273.     for(int i = 0; i < 4; i++){
  274.         for(int j = 0; j < 4; j++){
  275.             d_weight3[i][j] += learning_rate*error3[j]*output2[i];
  276.         }
  277.     }
  278.     for(int i = 0; i < 4; i++){
  279.         d_weight3[i][4] += learning_rate*error3[i];
  280.     }
  281.    
  282.    
  283.     for(int i = 0; i < 4; i++){
  284.         for(int j = 0; j < 4; j++){
  285.             d_weight2[i][j] += learning_rate*error2[j]*output1[i];
  286.         }
  287.     }
  288.     for(int i = 0; i < 4; i++){
  289.         d_weight2[i][4] += learning_rate*error2[i];
  290.     }
  291.    
  292.    
  293.     for(int i = 0; i < 4; i++){
  294.         for(int j = 0; j < 2; j++){
  295.             d_weight1[i][j] += learning_rate*error1[i]*training[iterator][j];
  296.         }
  297.     }
  298.     for(int i = 0; i < 4; i++){
  299.         d_weight1[i][2] += learning_rate*error1[i];
  300.     }
  301. }
  302.  
  303.  
  304. //*******************************************************************************************
  305. void weight_update(){
  306.    
  307.     for(int i = 0; i < 4; i++){
  308.         for(int j = 0; j < 3; j++){
  309.             weight1[i][j]+=d_weight1[i][j];
  310.         }
  311.     }
  312.    
  313.     for(int i = 0; i < 4; i++){
  314.         for(int j = 0; j < 5; j++){
  315.             weight2[i][j]+=d_weight2[i][j];
  316.         }
  317.     }
  318.    
  319.     for(int i = 0; i < 4; i++){
  320.         for(int j = 0; j < 5; j++){
  321.             weight3[i][j]+=d_weight3[i][j];
  322.         }
  323.     }
  324.    
  325.     for(int i = 0; i < 5; i++){
  326.         weight_o[i]+=d_weight_o[i];
  327.     }
  328. }
  329.  
  330.  
  331. //*******************************************************************************************
  332. void initialize_d_weights(){
  333.    
  334.     for(int i = 0; i < 4; i++){
  335.         for(int j = 0; j < 3; j++){
  336.             d_weight1[i][j]=0;
  337.         }
  338.     }
  339.    
  340.     for(int i = 0; i < 4; i++){
  341.         for(int j = 0; j < 5; j++){
  342.             d_weight2[i][j]=0;
  343.         }
  344.     }
  345.    
  346.     for(int i = 0; i < 4; i++){
  347.         for(int j = 0; j < 5; j++){
  348.             d_weight3[i][j]=0;
  349.         }
  350.     }
  351.    
  352.     for(int i = 0; i < 5; i++){
  353.         d_weight_o[i]=0;
  354.     }
  355. }
  356.  
  357.  
  358. //*******************************************************************************************
  359. void test(int i){
  360.    
  361.     double buffer[3] = {data[i][0], data[i][1], 1};
  362.    
  363.     for (int i = 0; i < 4; i++)
  364.     {
  365.         double sum = 0;
  366.         for(int j = 0; j < 3; j++)
  367.         {
  368.             sum += buffer[j] * weight1[i][j];
  369.         }
  370.         output1[i] = tanh(sum);
  371.     }
  372.     output1[4]=1;
  373.    
  374.    
  375.     for (int i = 0; i < 4; i++)
  376.     {
  377.         double sum = 0;
  378.         for (int j = 0; j < 5; j++)
  379.         {
  380.             sum += output1[j] * weight2[i][j];
  381.         }
  382.         output2[i] = tanh(sum);
  383.     }
  384.     output2[4]=1;
  385.    
  386.    
  387.     for (int i = 0; i < 4; i++)
  388.     {
  389.         double sum = 0;
  390.         for (int j = 0; j < 5; j++)
  391.         {
  392.             sum += output2[j] * weight3[i][j];
  393.         }
  394.         output3[i] = tanh(sum);
  395.     }
  396.     output3[4]=1;
  397.    
  398.    
  399.     double sum = 0;
  400.     for (int i = 0; i < 5; i++)
  401.     {
  402.         sum += output3[i] * weight_o[i];
  403.     }
  404.     output_o = tanh(sum);
  405. }
  406.  
  407.  
  408. int main(void) {
  409.    
  410.     int counter_t = 0;
  411.     int counter_d = 0;
  412.    
  413.     double error_sum = 0;
  414.    
  415.     double max_x = 0;
  416.     double max_y = 0;
  417.    
  418.     /*
  419.     training[0][0] = 1.3;
  420.     training[0][1] = 0.4;
  421.     training[0][2] = 1;
  422.     */
  423.    
  424.     //--------------------- EINLESEN -----------------------------------------------------
  425.    
  426.     input(&counter_t, &counter_d);
  427.    
  428.     //--------------------- FIND MAXIMUM -------------------------------------------------
  429.    
  430.     maximum(&counter_t, &counter_d, &max_x, &max_y);
  431.    
  432.     //--------------------- SCALIZATION OF MATRICES --------------------------------------
  433.    
  434.     scale_matrix(&counter_t, &counter_d, &max_x, &max_y);
  435.    
  436.     //--------------------- RANDOM VALUES TO WEIGHTS -------------------------------------
  437.    
  438.     random_weights();
  439.    
  440.     //--------------------- TRAINING OF NEURONAL NETWORK  --------------------------------
  441.    
  442.     /*
  443.    
  444.     output(0);
  445.    
  446.     for(int i = 0; i < 5; i++){
  447.         printf("output1: %lf\n", output1[i]);
  448.     }
  449.    
  450.     for(int i = 0; i < 5; i++){
  451.         printf("output2: %lf\n", output2[i]);
  452.     }
  453.    
  454.     for(int i = 0; i < 5; i++){
  455.         printf("output3: %lf\n", output3[i]);
  456.     }
  457.    
  458.     printf("output4: %lf\n", output4);
  459.    
  460.     error(0);
  461.    
  462.     for(int i = 0; i < 2; i++){
  463.         printf("error0; %lf\n", error0[i]);
  464.     }
  465.    
  466.     for(int i = 0; i < 4; i++){
  467.         printf("error1: %lf\n", error1[i]);
  468.     }
  469.    
  470.     for(int i = 0; i < 4; i++){
  471.         printf("error2: %lf\n", error2[i]);
  472.     }
  473.    
  474.     for(int i = 0; i < 4; i++){
  475.         printf("error3: %lf\n", error3[i]);
  476.     }
  477.    
  478.    
  479.     printf("error4: %lf\n", error4);
  480.     printf("\n");
  481.    
  482.     weight_change(0, 0.001);
  483.    
  484.     printf("d_weight4:\n");
  485.     for(int i = 0; i < 5; i++){
  486.         printf("%lf, ",d_weight4[i]);
  487.     }
  488.    
  489.     printf("\n");
  490.    
  491.     printf("d_weight3:\n");
  492.     for(int j = 0; j < 4; j++){
  493.         for(int i = 0; i < 5; i++){
  494.             printf("%lf, ",d_weight3[j][i]);
  495.         }
  496.          printf("\n");
  497.     }
  498.  
  499.    
  500.     printf("\n");
  501.    
  502.     printf("d_weight2:\n");
  503.     for(int j = 0; j < 4; j++){
  504.         for(int i = 0; i < 5; i++){
  505.            printf("%lf, ",d_weight2[j][i]);
  506.         }
  507.          printf("\n");
  508.     }
  509.  
  510.    
  511.     printf("\n");
  512.    
  513.     printf("d_weight1:\n");
  514.     for(int j = 0; j < 4; j++){
  515.         for(int i = 0; i < 3; i++){
  516.             printf("%lf, ",d_weight1[j][i]);
  517.         }
  518.          printf("\n");
  519.     }
  520.     printf("\n");
  521.     printf("\n");
  522.     printf("\n");
  523.  
  524.     weight_update();
  525.    
  526.     printf("weight4:\n");
  527.     for(int i = 0; i < 5; i++){
  528.         printf("%lf, ",weight4[i]);
  529.     }
  530.    
  531.     printf("\n");
  532.     printf("\n");
  533.    
  534.     printf("weight3:\n");
  535.     for(int j = 0; j < 4; j++){
  536.         for(int i = 0; i < 5; i++){
  537.             printf("%lf, ",weight3[j][i]);
  538.         }
  539.         printf("\n");
  540.     }
  541.    
  542.    
  543.     printf("\n");
  544.    
  545.     printf("weight2:\n");
  546.     for(int j = 0; j < 4; j++){
  547.         for(int i = 0; i < 5; i++){
  548.             printf("%lf, ",weight2[j][i]);
  549.         }
  550.         printf("\n");
  551.     }
  552.    
  553.    
  554.     printf("\n");
  555.    
  556.     printf("weight1:\n");
  557.     for(int j = 0; j < 4; j++){
  558.         for(int i = 0; i < 3; i++){
  559.             printf("%lf, ",weight1[j][i]);
  560.         }
  561.         printf("\n");
  562.     }
  563.  
  564.     */
  565.    
  566.    while(fabs(error_sum) > 0.001){
  567.        
  568.        error_sum = 0.0;
  569.        
  570.         for (int i = 0; i < counter_t; i++){
  571.             output(i);
  572.             error(i);
  573.             error_sum+= error_o;
  574.             weight_change(i, 0.001);
  575.         }
  576.        
  577.         //printf("%lf\n", error_sum);
  578.        
  579.         weight_update();
  580.        
  581.         initialize_d_weights();
  582.     }
  583.    
  584.     //--------------------- TESTING OF NEURON --------------------------------------------
  585.    
  586.     float value = 0.0;
  587.    
  588.     for(int i= 0; i < counter_d; i++){
  589.        
  590.         test(i);
  591.         value = output_o;
  592.        
  593.         if(value < 0){
  594.             printf("-1\n");
  595.         }
  596.        
  597.         else{
  598.             printf("+1\n");
  599.         }
  600.     }
  601.    
  602.     return 0;
  603. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement