NN 작성 중 3
2015-04-03 00:06:41

//배치 모드: deltaU, deltaV 의 값을 계산 후 이들의 평균을 구하고 이평균을 가지고 한꺼번에 가중치를 갱신하는 것.

//v(t+1) = v(t) + delta{v} = v(t) - L * round{E} / round{v}

//u(t+1) = u(t) + delta{u} = u(t) - L * round{E} / round{u}

//E = 0.5 * sigma(r=1->m){(t_r-o_r)^2} // mutlply 0.5 to calucate the partial derivative of E easly.

#include <stdio.h>

#include <math.h>

#include <stdlib.h> /* srand, rand */

#include <time.h> /* time */

#define real float

#define D 50

#define P 10

#define M 50

real L = 0.5;

#define A 1

#define STOP 0.4

#define F (D+1)*(D+1)// Feature 개수

real u[D+1][P+1];

real v[P+1][M+1];

//inline real sigmoid(real x){

//       return 2/(1 + exp(-x))-1;

//}

//inline real sigmoidDerivative(real num){

//       return 0.5 * (1+sigmoid(num)) * (1-sigmoid(num));

//}

//

inline real sigmoid(real x){ return 1/(1 + exp(-A*x)); }

inline real sigmoidDerivative(real x){ return A*sigmoid(x)*(1-sigmoid(x)); }

       real x[F][D+1]; // input feature

       real t[F][M+1]; // reference output feature

int main(){

       srand (time(NULL));

       bool go= true;

       real error = 0;

       //training set

       int intpuN=0;

       //setting x,t

       for(int i=0;i<=D/2;i++){

              for(int j=0;j<=D/2;j++,intpuN++){

                     for(int k=0;k<=D;k++){

                            if(k==(i+j)) t[intpuN][k]=1;

                            else               t[intpuN][k]=0;

                            

                            if(i!=k && j!=(k-(D/2))) x[intpuN][k]=0;

                            else{

                                   if(i==k){

                                          x[intpuN][k]=1;

                                   }

                                   if(j==(k-(D/2))){

                                          x[intpuN][k]=1;

                                   }

                            }

                     }

           &\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0nbsp;  }

       }

       for(int f=0;f<intpuN;f++){

              int a=-1,b=-1,c=-1;

              for(int k=0;k<=D;k++){

                     if(k<=(D/2)&&x[f][k]==1) a=k;

                     else if(x[f][k]==1) b=k-(D/2);

                     if(t[f][k]==1)                      c=k;

              }

              printf("Input : %d + %d = %d

",a,b,c);

       }

       

       real delta[M+1];

       real mu[P+1];

       real deltaV[P+1][M+1];

       real deltaU[D+1][P+1];

       real z_sum[P+1]; real z[P+1];

       real o_sum[M+1]; real o[M+1];

       //random initialize u, v

       for(int i=0;i<=D;i++){

              for(int j=1;j<=P;j++){

                     u[i][j] = 1/((rand()%10)+1.0);

              }

       }

       for(int j=0;j<=P;j++){

              for(int k=1;k<=M;k++){

                     v[j][k] = 1/((rand()%10)+1.0);

              }

       }

       //bias

       x[0][0] = 1.0;

       z[0] = 1.0;

       int iter=0;

       real prevError=-1;

       do{

              printf("Iteration : %d

",++iter);

              error =0;

              for(int f=0;f<intpuN;f++){

                     //set x, t

                     for(int j=1;j<=P;j++) z_sum[j] = 0;

              

                     for(int j=1;j<=P;j++){

                            for(int i=0;i<=D;i++){

                                   z_sum[j] += x[f][i]*u[i][j];

                            }

                            z[j] = sigmoid(z_sum[j]); //sigmoid

                     }

           \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0          for(int k=1;k<=M;k++) o_sum[k] = 0;

                     for(int k=1;k<=M;k++){

                            for(int j=0;j<=P;j++){

                                   o_sum[k] += z[j]*v[j][k];

                            }

                            o[k] = sigmoid(o_sum[k]); //sigmoid

                     }

                     

                     for(int k=1;k<=M;k++){

                            error += pow(t[f][k]-o[k],2);

                     }

                     

       

                     //delta

                     for(int k=1;k<=M;k++){

                            delta[k] = (t[f][k]-o[k]) * sigmoidDerivative(o_sum[k]);

                     }

                     //deltaV

                     for(int j=0;j<=P;j++){

                            for(int k=1;k<=M;k++){

                                   deltaV[j][k] = L*delta[k]*z[j];

                            }

                     }

       

                     //mu

                     for(int j=1;j<=P;j++){

                            mu[j] = 0;

                            for(int k=1;k<=M;k++){

                                   mu[j] += delta[k]*v[j][k];

                            }

                            mu[j] *= sigmoidDerivative(z_sum[j]);

                     }

                     //delta u

                     for(int i=0;i<=D;i++){

                            for(int j=1;j<=P;j++){

                                   deltaU[i][j] = L*mu[j]*x[f][i];

                  &nb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0sp;         }

                     }

                     //update weights

                     for(int j=0;j<=P;j++){

                            for(int k=1;k<=M;k++){

                                   v[j][k] += deltaV[j][k];

                            }

                     }

                     for(int i=0;i<=D;i++){

                            for(int j=1;j<=P;j++){

                                   u[i][j] += deltaU[i][j];

                            }

                     }

              }//for features

              error /=intpuN;

              printf("FF finished error : %.5f

",error);

              if((prevError - error) <=0.001 && prevError > 0){

              //       L/=2.0;

              }

              prevError = error;

              if(error<STOP) {

                     go = false;

                     break;

              }

       }while(go);

       //eval

       int testX[F][D+1];

       intpuN = 0;

       for(int i=1;i<=10;i++){

              for(int j=1;j<=10;j++,intpuN++){

                     for(int k=0;k<=D;k++){

                            if(i!=k && j!=k-(D/2)){

                                   x[intpuN][k]=0;

                            }else{

                                   if(i==k){

                                          x[intpuN][k]=1;

         &nb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0sp;                         }

                                   if(j==k-(D/2)){

                                          x[intpuN][k]=1;

                                   }

                            }

                     }

              }

       }

       int correct =0 ;

       for(int f=0;f<intpuN;f++){

              for(int j=1;j<=P;j++) z_sum[j] = 0;

              for(int j=1;j<=P;j++){

                     for(int i=0;i<=D;i++){

                            z_sum[j] += x[f][i]*u[i][j];

                     }

                     z[j] = sigmoid(z_sum[j]); //sigmoid

              }

              for(int k=1;k<=M;k++) o_sum[k] = 0;

              double max = -999999.0;

              int maxIdx = -1;

              for(int k=1;k<=M;k++){

                     for(int j=0;j<=P;j++){

                            o_sum[k] += z[j]*v[j][k];

                     }

                     o[k] = sigmoid(o_sum[k]); //sigmoid

                     if(o[k] > max){

                            max = o[k];

                            maxIdx = k;

                     }

              }

              int a=-1,b=-1;

              for(int i=0;i<=D;i++){

                     if(i<=(D/2)&&x[f][i]==1) a=i;

                     else if(x[f][i]==1) b=i-(D/2);

              }

              

              if(maxIdx == (a+b)) {

                     printf("CORRECT : %d + %d = %d

",a,b,maxIdx);

                     correct++;

              }else{

                     printf("WRONG : %d + %d = %d

",a,b,maxIdx);

              }

       }

       printf("%f correct

",correct/(real)intpuN);

}

▼ more
NN 작성 중 2
2015-04-01 23:01:24

//배치 모드: deltaU, deltaV 의 값을 계산 후 이들의 평균을 구하고 이평균을 가지고 한꺼번에 가중치를 갱신하는 것.

//v(t+1) = v(t) + delta{v} = v(t) - L * round{E} / round{v}

//u(t+1) = u(t) + delta{u} = u(t) - L * round{E} / round{u}

//E = 0.5 * sigma(r=1->m){(t_r-o_r)^2} // mutlply 0.5 to calucate the partial derivative of E easly.

#include <stdio.h>

#include <math.h>

#define real float

#define P 2

#define M 2

#define D 2

#define L 0.2

#define STOP 0.1

real u[D+1][P+1];

real v[P+1][M+1];

inline real sigmoid(real x){

    return 2/(1 + exp(-x))-1;

}

inline real sigmoidDerivative(real num){

    return 0.5 * (1+sigmoid(num)) * (1-sigmoid(num));

}

int main(){

    bool go= true;

    real error = 0;

    //training set

    real x[D+1]; // input feature

    real t[M+1]; // reference output feature

    t[1] = -1; t[2] = 1;

    real delta[M+1];

    real mu[P+1];

    real deltaV[P+1][M+1];

    real deltaU[D+1][P+1];

    real z_sum[P+1]; real z[P+1];

    real o_sum[M+1]; real o[M+1];

    //initialize u, v

    u[0][1] = 0.3;

    u[1][1] = 0.4;

    u[2][1] = 0.2;

    u[0][2] = -0.1;

    u[1][2] = -0.5;

    u[2][2] = 0.1;

    v[0][1] = 0.1;

    v[1][1] = -0.2;

    v[2][1] = 0.4;

    v[0][2] = 0.2;

    v[1][2] = 0.3;

    v[2][2] = -0.1;

    //bias

    x[0] = 1.0;

    z[0] = 1.0;

    //printWeight();

    x[1] = 0.7; x[2] = 0.2;

    do{

        //for(per sample x){

        //set x, t

        for(int j=1;j<=P;j++) z_sum[j] = 0;

        for(int j=1;j<=P;j++){

            for(int i=0;i<=D;i++){

                z_sum[j] += x[i]*u[i][j];

            }

            z[j] = sigmoid(z_sum[j]); //sigmoid

        }

        for(int k=1;k<=M;k++) o_sum[k] = 0;

        for(int k=1;k<=M;k++){

            for(int j=0;j<=P;j++){

                o_sum[k] += z[j]*v[j][k];

            }

            o[k] = sigmoid(o_sum[k]); //sigmoid

        }

        error =0;

      &n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0bsp; for(int k=1;k<=M;k++){

            error += pow(t[k]-o[k],2);

        }

        error *= 0.5;

     &\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0nbsp;  printf("FF finished o[1] : %.5f o[2] : %.5f error : %.5f

",o[1],o[2],error);

        if(error<STOP) break;

        //delta

        for(int k=1;k<=M;k++){

            delta[k] = (t[k]-o[k]) * sigmoidDerivative(o_sum[k]);

        }

        //deltaV

        for(int j=0;j<=P;j++){

            for(int k=1;k<=M;k++){

                deltaV[j][k] = L*delta[k]*z[j];

            }

        }

        //mu

        for(int j=1;j<=P;j++){

            mu[j] = 0;

            for(int k=1;k<=M;k++){

                mu[j] += delta[k]*v[j][k];

            }

            mu[j] *= sigmoidDerivative(z_sum[j]);

        }

        //delta u

        for(int i=0;i<=D;i++){

            for(int j=1;j<=P;j++){

                deltaU[i][j] = L*mu[j]*x[i];

            }

        }

        //update weights

        for(int j=0;j<=P;j++){

            for(int k=1;k<=M;k++){

                v[j][k] += deltaV[j][k];

            }

        }

        for(int i=0;i<=D;i++){

            for(int j=1;j<=P;j++){

                u[i][j] += deltaU[i][j];

            }

        }

    //}

    }while(go);

}

▼ more
NN 작성 중
2015-04-01 07:51:58

#include <stdio.h>

#include <math.h>

#define real float

#define P 2

#define M 2

#define D 2

real u[3][3];

real v[3][3];

void printWeight(){

    for(int i=1;i<3;i++){

        for(int j=0;j<3;j++){

            printf("%f %f

",u[j][i],v[j][i]);

        }

    }

}

int main(){

    bool go= true;

    //training set

    real x[D+2];

    real t[3];

    t[1] = -1;    t[2] = 1;

    real z_sum[P+1]; real z[P+1];

    real o_sum[M+1]; real o[M+1];

    //initialize u, v

    u[0][1] = 0.3;

    u[1][1] = 0.4;

    u[2][1] = 0.2;

    u[0][2] = -0.1;

    u[1][2] = -0.5;

    u[2][2] = 0.1;

    v[0][1] = 0.1;

    v[1][1] = -0.2;

    v[2][1] = 0.4;

    v[0][2] = 0.2;

    v[1][2] = 0.3;

    v[2][2] = -0.1;

    //bias

    x[0] = 1.0;

    z[0] = 1.0;

    //printWeight();

x[1] = 0.7; x[2] = 0.2;

    

    //do{

    //for(per sample x){

    //set x, t

    z_sum[0] = 0;z_sum[1] = 0;z_sum[2] = 0;

    for(int j=1;j<=P;j++){

        for(int i=0;i<=D;i++){

            z_sum[j] += x[i]*u[i][j];

        }

        //z[j] = exp(z_sum[j])/(1 + exp(z_sum[j])); //sigmoid

        z[j] = 2/(1 + exp(-z_sum[j]))-1; //sigmoid

    }

    o_sum[0] = 0;o_sum[1] = 0;o_sum[2] = 0;

    for(int k=1;k<=M;k++){

        for(int j=0;j<=P;j++){

            o_sum[k] += z[j]*v[j][k];

        }

        o[k] = 2/(1 + exp(-o_sum[k]))-1; //sigmoid

    }

    printf("FF finished o[1] : %f o[2] : %f

",o[1],o[2]);

    //delta v

    //delta u

    //}

    //}while(go);

}

▼ more
VectorAdd
2015-03-30 20:35:57

//Ref : https://youtu.be/Ed_h2km0liI

#include <stdio.h>

#define SIZE 1024

//1. parallelize this function

//3. modify function call as gpu

__global__ void VectorAdd(int *a, int *b, int *c, int n){

    

    int i = threadIdx.x;

    //for( i=0;i<n;i++){

    //    c[i] = a[i] + b[i];

    //}

    if(i < n)

        c[i] = a[i] + b[i];

    

}

//2. allocate memory on GPU memory

//2.1) Data copied from CPU to GPu

//2.2) Launch VectorAdd kernel on the GPU

//2.3) Resulting data copied from GPU to CPU

int main(){

    int *a, *b, *c, i;

    int *d_a, *d_b, *d_c; // device

    a = (int*)malloc(sizeof(int)*SIZE);

    b = (int*)malloc(sizeof(int)*SIZE);

    c = (int*)malloc(sizeof(int)*SIZE);

    //gpu side memory

    cudaMalloc(&d_a, SIZE*sizeof(int));

    cudaMalloc(&d_b, SIZE*sizeof(int));

    cudaMalloc(&d_c, SIZE*sizeof(int));

    for(i=0;i<SIZE;++i){

            a[i] = i;

            b[i] = i;

            c[i] = 0;

    }

    cudaMemcpy(d_a,a,SIZE*sizeof(int),cudaMemcpyHostToDevice); // => 2.1

    cudaMemcpy(d_b,b,SIZE*sizeof(int),cudaMemcpyHostToDevice); // => 2.1

    cudaMemcpy(d_c,c,SIZE*sizeof(int),cudaMemcpyHostToDevice); // => 2.1

    VectorAdd<<<1, SIZE>>>(d_a, d_b, d_c, SIZE);//1 block, SIZE threads => 2.2

    cudaMemcpy(c,d_c,SIZE*sizeof(int),cudaMemcpyDeviceToHost); // => 2.3

    for(i=0;i<10;++i){

        printf("c[%d] = %d

",i,c[i]);

    }

    free(a);

    free(b);

    free(c);

    cudaFree(d_a);

    cudaFree(d_b);

    cudaFree(d_c);

    return 0;

}

▼ more