관련 된 것을 미리 해두는 것은 서두르는 것이 아니었다.
조급함과 게으름이 함께 오는 경우 서두르게 되는데,
조금만 더 성실히 미리 준비하면 많이 고칠 수 있겠지.
관련 된 것을 미리 해두는 것은 서두르는 것이 아니었다.
조급함과 게으름이 함께 오는 경우 서두르게 되는데,
조금만 더 성실히 미리 준비하면 많이 고칠 수 있겠지.
G.SKILL
RIP
F3-12800CL9D-4GBXL
http://info.usherbrooke.ca/hlarochelle/neural_networks/content.html
참 대단한 분이 많다.
//배치 모드: 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);
}