続1層のニューラルネットワーク
ソースを整理。
今夜あたり2層にしてバックプロパゲーションをやってみよう
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> const float alpha=0.02; enum { inputs=3 }; float w[inputs]; float sigmoid(float x) { return 1.0/(1.0+exp(-x)); } float dsigmoid(float x) { float z=sigmoid(x); return z*(1.0-z); } float nn(int x[],int teach) { for(int i=0;i<inputs-1;i++) if(x[i]==0) x[i]=-1; //出力計算 float z0 = 0; for(int i=0;i<inputs;i++) z0 += w[i]*x[i]; float z=sigmoid(z0); //誤差計算 float err0 = (teach - z); float err = err0*err0; //誤差をパラメーターw毎に微分計算 float derr_dw[inputs]; for(int i=0;i<inputs;i++) derr_dw[i] = err0 * dsigmoid(z0)*x[i]; //パラメーターw更新 for(int i=0;i<inputs;i++) w[i] += alpha * derr_dw[i]; printf("x="); for(int i=0;i<inputs;i++) printf("%+2d,",x[i] ); printf("w="); for(int i=0;i<inputs;i++) printf("%5.2f,",w[i] ); printf("\n teach=%d z0=%5.2f z=%5.2f err0=%5.2f err=%5.4f \n", teach, z0,z ,err0,err ); return z; } void main() { srand((unsigned) time(NULL)); int x[inputs]; for(int step=0;;step++) { for(int i=0;i<inputs-1;i++) x[i]=rand()%2; x[inputs-1]=1; int teach=x[0]&x[1]; printf("%d:",step); float z = nn(x,teach); } }