Advertisement
Guest User

CNN in C by Arcanite ~ cleaned

a guest
Dec 8th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.07 KB | None | 0 0
  1.  
  2. void MLP(Vector*I, Matrix*[] W, Vector*[] B){
  3.     Vector* H1 = vec_sigmoid(imatVecAddMul(W[0], I, 1, B[0], 1));
  4.     Vector* H2 = vec_sigmoid(imatVecAddMul(W[1], H1, 1, B[1], 1));
  5.     Vector* output = vec_sigmoid(imatVecAddMul(W[2], H2, 1, B[2], 1));
  6.  
  7.    return maxat(output); //returns the index of the biggest value in output
  8. }
  9.  
  10. mnum cost(int rightLabel, vector* neuralNetOut){
  11.     mnum output = 0;
  12.     for(int i = 0; i < 62; i++){
  13.         output += neuralNetOut[i];
  14.     }
  15.     return output;
  16. }
  17.  
  18. Vector* vec_sigmoid(Vector* v){
  19.     Vector* output = emptyVec(vecd(v));
  20.     for(int i = 0; i < vecd(v); i++) matsat(output,i,sigmoid(matat(v,i)));
  21.     return output;
  22. }
  23.  
  24. mnum sigmoid(mnun x){
  25.    return 1/(1+exp(-x));
  26. }
  27.  
  28. mnum sigmoid_prime(mnun x){
  29.     mnun s = sigmoid(x);
  30.     return s*(1-s);
  31. }
  32.  
  33. mnum vec_sigmoid_prime(Vector* v, mnun x){
  34.  
  35.     Vector* output = emptyVec(vecd(v));
  36.  
  37.     for (int i = 0; i < vecd(v); ++i)
  38.     {
  39.         vecsat(output,i,sigmoid_prime(vecat(v,i)));
  40.     }
  41.  
  42.     return output;
  43. }
  44.  
  45.  
  46. mnum mse(int[] rightLabels, vector*[] neuralNetOuts, int sizeBatch){ //mean square error
  47.     mnum output = 0;
  48.     for(int i = 0; i < sizeBatch; i++){
  49.         output += cost(rightLabel[i], neuralNetOuts[i]);
  50.     }
  51.     return output/sizeBatch;
  52. }
  53.  
  54. //don't mind this, we'll update it little by little
  55. void MLP_L(Vector*[] I, int nbTrainingSamples, Vector* rightLabels[],  Matrix*[] W, Vector*[] B, mnum learning_rate){
  56.  
  57. //init
  58.     //gradients for weights
  59.     Matrix* dc_dw2 = emptyMat(matm(W[2]), matn(W[2]));
  60.     Matrix* dc_dw1 = emptyMat(matm(W[1]), matn(W[1]));
  61.     Matrix* dc_dw0 = emptyMat(matm(W[0]), matn(W[0]));
  62.  
  63.     //gradients for matrices
  64.     Vector* dc_db2_t = emptyVec(vecd(B[2]));
  65.     Vector* dc_db1_t = emptyVec(vecd(B[1]));
  66.     Vector* dc_db0_t = emptyVec(vecd(B[0]));
  67.  
  68. //computations
  69.     for(int t = 0; t < nbTrainingSamples; t++){
  70.    
  71.     //init
  72.         //local gradients for weights
  73.         Vector* dc_dw2_t = emptyMat(matm(W[2]), matn(W[2]));
  74.         Vector* dc_dw1_t = emptyMat(matm(W[1]), matn(W[1]));
  75.         Vector* dc_dw0_t = emptyMat(matm(W[0]), matn(W[0]));
  76.        
  77.         //local gradients for biases
  78.         Vector* dc_db2_t = emptyVec(vecd(B[2]));
  79.         Vector* dc_db1_t = emptyVec(vecd(B[1]));
  80.         Vector* dc_db0_t = emptyVec(vecd(B[0]));
  81.  
  82.     //forward    
  83.         Vector* z[3];
  84.  
  85.         z[0] = imatVecAddMul(W[0], I, 1, B[0], 1); //dim vec(B[0])
  86.         Vector* H1 = vec_sigmoid(z[0]); //dim vec(B[0])
  87.  
  88.         z[1] = imatVecAddMul(W[1], H1, 1, B[1], 1); //dim vec(B[1])
  89.         Vector* H2 = vec_sigmoid(z[1]); //dim vec(B[1])
  90.  
  91.         z[2] = imatVecAddMul(W[2], H2, 1, B[2], 1); //dim vec(B[2])
  92.         Vector* output = vec_sigmoid(z[2]); //dim vec(B[2])
  93.     //backprop
  94.    
  95.         //backprop Output layer
  96.         let dc_do = imatMul((ivmatVMatAdd(rightLabels[t], -1, output)), 2); //dim vec(output)
  97.  
  98.         let do_dz2 = vec_sigmoid_prime(z[2]);
  99.         let dc_dz2 = ivecVecHadamul(dc_do, do_dz2,1); //62.1
  100.  
  101.         let dz2_dw2 = H2; //189x1
  102.         let dz2_db2 = 1; //mnum
  103.         let dz2_dh2 = W[2]; //62x189
  104.  
  105.         dc_dw2_t =  imatMatMul(dc_dz2, imatTranspose(dz2_dw2), 1); //62x189 = 62x1 * 1x189
  106.         dc_db2_t = vecMul(dc_dz2, dz2_db2); // 62x1 = 62x1 * 1
  107.  
  108.         //backprop H2 layer
  109.         let dh2_dz1 = vec_sigmoid_prime(z[1]); // 189x1
  110.         let dc_dz1 = ivecVecHadamul(imatTranspose(imatMatMul(imatTranspose(dc_dz2), dz2_dh2), 1), dh2_dz1, 1); // 189x1 = imatTranspose(imatTranspose(62x1) * 62x189) * 189x1 = 189x1*189x1
  111.  
  112.         let dz1_dw1 = H1; //378x1
  113.         let dz1_db1 = 1; //mnum
  114.         let dz1_dh1 = W[1]; // 189x378
  115.  
  116.         dc_dw1_t = imatMatMul(dc_dz1, imatTranspose(dz1_dw1),1); // 189x378 = 189x1 * imatTranspose(378x1)
  117.         dc_db1_t = vecMul(dc_dz1, dz1_db1); //189x1 = 189x1 * 1
  118.        
  119.         //backprop H1 layer
  120.         let dh1_dz0 = vec_sigmoid_prime(z[0]); //378x1
  121.         let dc_dz0 = ivecVecHadamul(imatTranspose(imatMatMul(imatTranspose(dc_dz1), dz1_dh1, 1)), dh1_dz0, 1); // 378x1 = imatTranspose(imatTranspose(189x1) * 189x378) * 378x1 = 378x1 * 378x1
  122.  
  123.  
  124.         let dz0_dw0 = I; //784x1
  125.         let dz0_db0 = 1; //mnum
  126.  
  127.         dc_dw0_t = imatMatMul(dc_dz0, imatTranspose(dz0_dw0), 1); //378x784 = 378x1 * imatTranspose(784x1)
  128.         dc_db0_t = vecMul(dc_dz0, dz0_db0); // 378x1 = 378x1 * 1
  129.  
  130.     //updating grads
  131.         //precomputation
  132.         mnum lambda = 1/nbTrainingSamples;
  133.        
  134.         //updating weights
  135.         dc_dw2 = ivmatVMatAdd(matMul(dc_dw2_t, lambda), 1, dc_dw2);
  136.         dc_dw1 = ivmatVMatAdd(matMul(dc_dw1_t, lambda), 1, dc_dw1);
  137.         dc_dw0 = ivmatVMatAdd(matMul(dc_dw0_t, lambda), 1, dc_dw0);
  138.        
  139.         //updating biases
  140.         dc_db2 = ivmatVMatAdd(matMul(dc_db2_t, lambda), 1, dc_db2);
  141.         dc_db1 = ivmatVMatAdd(matMul(dc_db1_t, lambda), 1, dc_db1);
  142.         dc_db0 = ivmatVMatAdd(matMul(dc_db0_t, lambda), 1, dc_db0);
  143.     }
  144.  
  145. //learning
  146.     //updating weights
  147.     W[2] = ivmatVMatAdd(ivmatVMatAdd(matMul(dc_dw2, -learning_rate), 1, W[2]);
  148.     W[1] = ivmatVMatAdd(ivmatVMatAdd(matMul(dc_dw1, -learning_rate), 1, W[1]);
  149.     W[0] = ivmatVMatAdd(ivmatVMatAdd(matMul(dc_dw0, -learning_rate), 1, W[0]);
  150.  
  151.     //updating biases
  152.     B[2] = ivmatVMatAdd(ivmatVMatAdd(matMul(dc_db2, -learning_rate), 1, B[2]);
  153.     B[1] = ivmatVMatAdd(ivmatVMatAdd(matMul(dc_db1, -learning_rate), 1, B[1]);
  154.     B[0] = ivmatVMatAdd(ivmatVMatAdd(matMul(dc_db0, -learning_rate), 1, B[0]);
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement