Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. using std::ofstream;
  5. #include <cmath>
  6. using namespace std;
  7. vector<vector<double>> arr;
  8. vector<double> label;
  9. vector<vector<int>> target;
  10. int number_of_images = 0;
  11. int ReverseIntData(int i)
  12. {
  13.     unsigned char ch1, ch2, ch3, ch4;
  14.     ch1 = i & 255;
  15.     ch2 = (i >> 8) & 255;
  16.     ch3 = (i >> 16) & 255;
  17.     ch4 = (i >> 24) & 255;
  18.     return((int)ch1 << 24) + ((int)ch2 << 16) + ((int)ch3 << 8) + ch4;
  19. }
  20. void ReadMNISTData() {
  21.     ifstream filetrain, filelabel;
  22.     filetrain.open("C:\\t10k-images-idx3-ubyte\\t10k-images.idx3-ubyte", ios::binary);
  23.     filelabel.open("C:\\Users\\Tasmin\\Downloads\\t10k-labels-idx1-ubyte\\t10k-labels.idx1-ubyte", ios::binary);
  24.     if (filetrain.is_open()) {
  25.  
  26.         int magic_number = 0, n_rows = 0, n_cols = 0;
  27.         // Reading from file magic number, #of images, #of rows and #of columns
  28.         filetrain.read((char *)&magic_number, sizeof(magic_number));
  29.         magic_number = ReverseIntData(magic_number);
  30.         filetrain.read((char *)&number_of_images, sizeof(number_of_images));
  31.         number_of_images = ReverseIntData(number_of_images);
  32.         filetrain.read((char *)&n_rows, sizeof(n_rows));
  33.         n_rows = ReverseIntData(n_rows);
  34.         filetrain.read((char *)&n_cols, sizeof(n_cols));
  35.         n_cols = ReverseIntData(n_cols);
  36.         arr.resize(number_of_images, vector<double>(784));
  37.         int x;
  38.         for (int i = 0; i < number_of_images; ++i) {
  39.             for (int j = 0; j < 784; ++j) {
  40.                 unsigned char flag = 0;
  41.                 filetrain.read((char *)&flag, sizeof(flag));
  42.                 arr[i][j] = (double)flag;
  43.                 //cout << arr[i][j];
  44.             }
  45.             //cout << endl;
  46.  
  47.         }
  48.     }
  49.     else {
  50.         cout << "cant open the file";
  51.     }
  52.     if (filelabel.is_open()) {
  53.  
  54.         int magic_number = 0, number_of_items = 0;
  55.         unsigned char flag = 0;
  56.         filelabel.read((char *)&magic_number, sizeof(magic_number));
  57.         magic_number = ReverseIntData(magic_number);
  58.         //cout << magic_number;
  59.         filelabel.read((char *)&number_of_items, sizeof(number_of_items));
  60.         number_of_items = ReverseIntData(number_of_items);
  61.         //cout << number_of_items;
  62.         label.resize(number_of_items);
  63.         target.resize(number_of_items, vector<int>(10));
  64.         for (int i = 0; i < number_of_items; ++i) {
  65.             for (int j = 0; j < 10; ++j) {
  66.                 target[i][j] = 0;
  67.             }
  68.         }
  69.         for (int i = 0; i < number_of_items; ++i) {
  70.             filelabel.read((char *)&flag, sizeof(flag));
  71.             //flag = ReverseIntData(flag);
  72.             label[i] = (double)flag;
  73.             target[i][label[i]] = 1;
  74.             //cout << label[i] <<" ";
  75.         }
  76.         /*for (int i = 0; i < number_of_items; ++i) {
  77.         for (int j = 0; j < 10; ++j) {
  78.         cout << target[i][j] << " ";
  79.         }
  80.         cout << endl;
  81.         }*/
  82.  
  83.  
  84.     }
  85.     else {
  86.         cout << "cant open the file";
  87.     }
  88. }
  89. int main()
  90. {
  91.     ofstream outfile("file2.txt");
  92.     ReadMNISTData();
  93.     number_of_images =20;
  94.     vector<vector<double>> W;
  95.     W.resize(784, vector<double>(30));
  96.     vector<vector<double>> U;
  97.     U.resize(30, vector<double>(10));
  98.     vector<double> B;
  99.     B.resize(30);
  100.     vector<double> C;
  101.     C.resize(10);
  102.     vector<double> Y;
  103.     Y.resize(30);
  104.     vector<double> Z;
  105.     Z.resize(10);
  106.     vector<double> SB;
  107.     SB.resize(30);
  108.     vector<double> RC;
  109.     RC.resize(10);
  110.     float S = 0, R = 0;
  111.     double e = 0.2;
  112.     //initialize W
  113.     for (int i = 0; i < 784; ++i) {//W transpose
  114.         for (int j = 0; j < 30; ++j) {
  115.             W[i][j] = float(rand()) / float(RAND_MAX) - 0.5;
  116.         }
  117.  
  118.     }
  119.     //initialize B
  120.     for (int i = 0; i < 30; ++i) {
  121.         B[i] = float(rand()) / float(RAND_MAX) - 0.5;
  122.     }
  123.  
  124.     //initialize U
  125.     for (int i = 0; i < 30; ++i) {
  126.         for (int j = 0; j < 10; ++j) {
  127.             U[i][j] = float(rand()) / float(RAND_MAX) - 0.5;
  128.         }
  129.  
  130.     }
  131.     //initialize C
  132.     for (int i = 0; i < 10; ++i) {
  133.         C[i] = float(rand()) / float(RAND_MAX) - 0.5;
  134.     }
  135.     //initial Training
  136.     for (int o = 0; o < number_of_images; ++o) {
  137.  
  138.         //Calculate Y
  139.         for (int i = 0; i < 30; ++i) {//transoise of w
  140.             for (int j = 0; j < 784; ++j) {
  141.                 S = S + W[j][i] * arr[o][j];
  142.             }
  143.             SB[i] = S + B[i];
  144.             Y[i] = 1.0 / (1.0 + exp(-(SB[i])));
  145.             S = 0;
  146.         }
  147.         /*for (int i = 0; i < 10; ++i) {
  148.         cout<<Y[i]<<" ";
  149.  
  150.         }*/
  151.         //Calculate Z
  152.         for (int i = 0; i < 10; ++i) {//transpose of U
  153.             for (int j = 0; j < 30; ++j) {
  154.                 R = R + U[j][i] * Y[j];
  155.  
  156.             }
  157.             RC[i] = R + C[i];
  158.             Z[i] = 1.0 / (1.0 + exp(-(RC[i])));
  159.             R = 0;
  160.         }
  161.  
  162.         for (int i = 0; i < 10; ++i) {
  163.             outfile << Z[i] << " ";
  164.  
  165.         }
  166.         outfile << endl;
  167.         for (int i = 0; i < 10; ++i) {
  168.             outfile << target[o][i] << " ";
  169.  
  170.         }
  171.         outfile << endl;
  172.         //Backpropagation starts
  173.         //Update U
  174.         for (int i = 0; i < 30; ++i) {
  175.             for (int j = 0; j < 10; ++j) {
  176.                 U[i][j] = U[i][j] + e * Z[j] * (Z[j] - target[o][j])*(Z[j] - 1)*Y[i];
  177.                 //cout << U[i][j]<<" ";
  178.             }
  179.             //cout << endl;
  180.         }
  181.         //Update W
  182.         double w_Sum = 0.0;
  183.         for (int n = 0; n < 30; ++n) {// for 30 neuron
  184.             for (int k = 0; k < 784; ++k) {
  185.                 for (int i = 0; i < 10; ++i) {//10ta sum
  186.                     w_Sum = w_Sum + (1.0 - Z[i])*(Z[i] - target[o][i])*Z[i] * U[n][i] * (1.0 - Y[n])*Y[n] * arr[o][k];
  187.  
  188.                 }
  189.                 W[k][n] = W[k][n] - e * w_Sum;
  190.                 w_Sum = 0.0;
  191.             }
  192.         }
  193.         //Update C
  194.         for (int i = 0; i < 10; ++i) {
  195.             C[i] = C[i] - e * (Z[i] - target[o][i])*(1 - Z[i])*Z[i];
  196.         }
  197.         //Uppdate B
  198.         double b_Sum = 0.0;
  199.         for (int i = 0; i < 30; ++i) {
  200.             for (int j = 0; j < 10; ++j) {
  201.                 b_Sum = b_Sum + (Z[j] - target[o][j])*(1 - Z[j])*Z[j] * U[i][j] * Y[i] * (1 - Y[i]);
  202.             }
  203.             b_Sum = b_Sum * Y[i] * (1.0 - Y[i]);
  204.             B[i] = B[i] - e * b_Sum;
  205.         }
  206.  
  207.     }
  208.     //epoch
  209.     for (int j = 0; j < 10; j++) {
  210.         cout << "BEGINING OF EPOCH " << j + 2 << endl;
  211.         for (int o = 0; o < number_of_images; ++o) {
  212.  
  213.             //Calculate Y
  214.             for (int i = 0; i < 30; ++i) {//transoise of w
  215.                 for (int j = 0; j < 784; ++j) {
  216.                     S = S + W[j][i] * arr[o][j];
  217.                 }
  218.                 SB[i] = S + B[i];
  219.                 Y[i] = 1.0 / (1.0 + exp(-(SB[i])));
  220.                 S = 0;
  221.             }
  222.             /*for (int i = 0; i < 10; ++i) {
  223.             cout<<Y[i]<<" ";
  224.  
  225.             }*/
  226.             //Calculate Z
  227.             for (int i = 0; i < 10; ++i) {//transpose of U
  228.                 for (int j = 0; j < 30; ++j) {
  229.                     R = R + U[j][i] * Y[j];
  230.  
  231.                 }
  232.                 RC[i] = R + C[i];
  233.                 Z[i] = 1.0 / (1.0 + exp(-(RC[i])));
  234.                 R = 0;
  235.             }
  236.  
  237.             for (int i = 0; i < 10; ++i) {
  238.                 outfile << Z[i] << " ";
  239.  
  240.             }
  241.             outfile << endl;
  242.             for (int i = 0; i < 10; ++i) {
  243.                 outfile << target[o][i] << " ";
  244.  
  245.             }
  246.             outfile << endl;
  247.             //Backpropagation starts
  248.             //Update U
  249.             for (int i = 0; i < 30; ++i) {
  250.                 for (int j = 0; j < 10; ++j) {
  251.                     U[i][j] = U[i][j] + e * Z[j] * (Z[j] - target[o][j]) * (Z[j] - 1) * Y[i];
  252.                     //cout << U[i][j]<<" ";
  253.                 }
  254.                 //cout << endl;
  255.             }
  256.             //Update W
  257.             double w_Sum = 0.0;
  258.             for (int n = 0; n < 30; ++n) {// for 30 neuron
  259.                 for (int k = 0; k < 784; ++k) {
  260.                     for (int i = 0; i < 10; ++i) {//10ta sum
  261.                         w_Sum = w_Sum +
  262.                             (1.0 - Z[i]) * (Z[i] - target[o][i]) * Z[i] * U[n][i] * (1.0 - Y[n]) * Y[n] * arr[o][k];
  263.  
  264.                     }
  265.                     W[k][n] = W[k][n] - e * w_Sum;
  266.                     w_Sum = 0.0;
  267.                 }
  268.             }
  269.             //Update C
  270.             for (int i = 0; i < 10; ++i) {
  271.                 C[i] = C[i] - e * (Z[i] - target[o][i]) * (1 - Z[i]) * Z[i];
  272.             }
  273.             //Uppdate B
  274.             double b_Sum = 0.0;
  275.             for (int i = 0; i < 30; ++i) {
  276.                 for (int j = 0; j < 10; ++j) {
  277.                     b_Sum = b_Sum + (Z[j] - target[o][j]) * (1 - Z[j]) * Z[j] * U[i][j] * Y[i] * (1 - Y[i]);
  278.                 }
  279.                 b_Sum = b_Sum * Y[i] * (1.0 - Y[i]);
  280.                 B[i] = B[i] - e * b_Sum;
  281.             }
  282.  
  283.         }
  284.     }
  285.     cout << "finished";
  286.     outfile << "finished";
  287.    
  288.     getchar();
  289.     return 0;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement