Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.92 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("/Users/Riya/Downloads/train-images-idx3-ubyte", ios::binary);
  23.     filelabel.open("/Users/Riya/Downloads/train-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.     vector<vector<double>> W;
  94.     W.resize(784, vector<double>(30));
  95.     vector<vector<double>> U;
  96.     U.resize(30, vector<double>(10));
  97.     vector<double> B;
  98.     B.resize(30);
  99.     vector<double> C;
  100.     C.resize(10);
  101.     vector<double> Y;
  102.     Y.resize(30);
  103.     vector<double> Z;
  104.     Z.resize(10);
  105.     vector<double> SB;
  106.     SB.resize(30);
  107.     vector<double> RC;
  108.     RC.resize(10);
  109.     float S = 0, R = 0;
  110.     double e = 0.2;
  111.     //initialize W
  112.     for (int i = 0; i < 784; ++i) {//W transpose
  113.         for (int j = 0; j < 30; ++j) {
  114.             W[i][j] = float(rand()) / float(RAND_MAX) - 0.5;
  115.         }
  116.  
  117.     }
  118.     //initialize B
  119.     for (int i = 0; i < 30; ++i) {
  120.         B[i] = float(rand()) / float(RAND_MAX) - 0.5;
  121.     }
  122.  
  123.     //initialize U
  124.     for (int i = 0; i < 30; ++i) {
  125.         for (int j = 0; j < 10; ++j) {
  126.             U[i][j] = float(rand()) / float(RAND_MAX) - 0.5;
  127.         }
  128.  
  129.     }
  130.     //initialize C
  131.     for (int i = 0; i < 10; ++i) {
  132.         C[i] = float(rand()) / float(RAND_MAX) - 0.5;
  133.     }
  134.  
  135.     for (int o = 0; o < number_of_images; ++o) {
  136.  
  137.         //Calculate Y
  138.         for (int i = 0; i < 30; ++i) {//transoise of w
  139.             for (int j = 0; j < 784; ++j) {
  140.                 S = S + W[j][i] * arr[o][j];
  141.             }
  142.             SB[i] = S + B[i];
  143.             Y[i] = 1.0 / (1.0 + exp(-(SB[i])));
  144.             S = 0;
  145.         }
  146.         /*for (int i = 0; i < 10; ++i) {
  147.         cout<<Y[i]<<" ";
  148.  
  149.         }*/
  150.         //Calculate Z
  151.         for (int i = 0; i < 10; ++i) {//transpose of U
  152.             for (int j = 0; j < 30; ++j) {
  153.                 R = R + U[j][i] * Y[j];
  154.  
  155.             }
  156.             RC[i] = R + C[i];
  157.             Z[i] = 1.0 / (1.0 + exp(-(RC[i])));
  158.             R = 0;
  159.         }
  160.  
  161.         for (int i = 0; i < 10; ++i) {
  162.             outfile<< Z[i] << " ";
  163.  
  164.         }
  165.         outfile<<endl;
  166.         for (int i = 0; i < 10; ++i) {
  167.             outfile<< target[o][i] << " ";
  168.  
  169.         }
  170.         outfile<<endl;
  171.         //Backpropagation starts
  172.         //Update U
  173.         for (int i = 0; i < 30; ++i) {
  174.             for (int j = 0; j < 10; ++j) {
  175.                 U[i][j] = U[i][j] + e * Z[j] * (Z[j] - target[o][j])*(Z[j] - 1)*Y[i];
  176.                 //cout << U[i][j]<<" ";
  177.             }
  178.             //cout << endl;
  179.         }
  180.         //Update W
  181.         double w_Sum = 0.0;
  182.         for (int n = 0; n < 30; ++n) {// for 30 neuron
  183.             for (int k = 0; k < 784; ++k) {
  184.                 for (int i = 0; i < 10; ++i) {//10ta sum
  185.                     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];
  186.  
  187.                 }
  188.                 W[k][n] = W[k][n] - e * w_Sum;
  189.                 w_Sum=0.0;
  190.             }
  191.         }
  192.         //Update C
  193.         for (int i = 0; i < 10; ++i) {
  194.             C[i] = C[i] - e * (Z[i] - target[o][i])*(1 - Z[i])*Z[i];
  195.         }
  196.         //Uppdate B
  197.         double b_Sum = 0.0;
  198.         for (int i = 0; i < 30; ++i) {
  199.             for (int j = 0; j < 10; ++j) {
  200.                 b_Sum = b_Sum + (Z[j] - target[o][j])*(1 - Z[j])*Z[j] * U[i][j]*Y[i]*(1-Y[i]);
  201.             }
  202.             b_Sum = b_Sum * Y[i] * (1.0 - Y[i]);
  203.             B[i] = B[i] - e * b_Sum;
  204.         }
  205.  
  206.     }
  207.     for (int j = 0; j < 10; j++) {
  208.         outfile << "BEGINING OF EPOCH " << j + 2 << endl;
  209.         for (int o = 0; o < number_of_images; ++o) {
  210.  
  211.             //Calculate Y
  212.             for (int i = 0; i < 30; ++i) {//transoise of w
  213.                 for (int j = 0; j < 784; ++j) {
  214.                     S = S + W[j][i] * arr[o][j];
  215.                 }
  216.                 SB[i] = S + B[i];
  217.                 Y[i] = 1.0 / (1.0 + exp(-(SB[i])));
  218.                 S = 0;
  219.             }
  220.             /*for (int i = 0; i < 10; ++i) {
  221.             cout<<Y[i]<<" ";
  222.  
  223.             }*/
  224.             //Calculate Z
  225.             for (int i = 0; i < 10; ++i) {//transpose of U
  226.                 for (int j = 0; j < 30; ++j) {
  227.                     R = R + U[j][i] * Y[j];
  228.  
  229.                 }
  230.                 RC[i] = R + C[i];
  231.                 Z[i] = 1.0 / (1.0 + exp(-(RC[i])));
  232.                 R = 0;
  233.             }
  234.  
  235.             for (int i = 0; i < 10; ++i) {
  236.                 outfile << Z[i] << " ";
  237.  
  238.             }
  239.             outfile << endl;
  240.             for (int i = 0; i < 10; ++i) {
  241.                 outfile << target[o][i] << " ";
  242.  
  243.             }
  244.             outfile << endl;
  245.             //Backpropagation starts
  246.             //Update U
  247.             for (int i = 0; i < 30; ++i) {
  248.                 for (int j = 0; j < 10; ++j) {
  249.                     U[i][j] = U[i][j] + e * Z[j] * (Z[j] - target[o][j]) * (Z[j] - 1) * Y[i];
  250.                     //cout << U[i][j]<<" ";
  251.                 }
  252.                 //cout << endl;
  253.             }
  254.             //Update W
  255.             double w_Sum = 0.0;
  256.             for (int n = 0; n < 30; ++n) {// for 30 neuron
  257.                 for (int k = 0; k < 784; ++k) {
  258.                     for (int i = 0; i < 10; ++i) {//10ta sum
  259.                         w_Sum = w_Sum +
  260.                                 (1.0 - Z[i]) * (Z[i] - target[o][i]) * Z[i] * U[n][i] * (1.0 - Y[n]) * Y[n] * arr[o][k];
  261.  
  262.                     }
  263.                     W[k][n] = W[k][n] - e * w_Sum;
  264.                     w_Sum = 0.0;
  265.                 }
  266.             }
  267.             //Update C
  268.             for (int i = 0; i < 10; ++i) {
  269.                 C[i] = C[i] - e * (Z[i] - target[o][i]) * (1 - Z[i]) * Z[i];
  270.             }
  271.             //Uppdate B
  272.             double b_Sum = 0.0;
  273.             for (int i = 0; i < 30; ++i) {
  274.                 for (int j = 0; j < 10; ++j) {
  275.                     b_Sum = b_Sum + (Z[j] - target[o][j]) * (1 - Z[j]) * Z[j] * U[i][j] * Y[i] * (1 - Y[i]);
  276.                 }
  277.                 b_Sum = b_Sum * Y[i] * (1.0 - Y[i]);
  278.                 B[i] = B[i] - e * b_Sum;
  279.             }
  280.  
  281.         }
  282.     }
  283.     cout<<"finished";
  284.     outfile<<"finished";
  285.     getchar();
  286.     return 0;
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement