그 무엇이라도
2015-04-12 22:50:36

관련 된 것을 미리 해두는 것은 서두르는 것이 아니었다.

조급함과 게으름이 함께 오는 경우 서두르게 되는데,

조금만 더 성실히 미리 준비하면 많이 고칠 수 있겠지.

▼ more
램사진
2015-04-10 22:12:57

G.SKILL

RIP

F3-12800CL9D-4GBXL

▼ more
신경망을 활용한 언어모델 방법 관련사이트
2015-04-09 22:56:15

http://info.usherbrooke.ca/hlarochelle/neural_networks/content.html

참 대단한 분이 많다.

▼ more
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