2入力1出力(中間層2)の階層型ニューラルネットワーク(信号と重みの名前)
プログラム例(の方針)
1.関数の宣言
結合加重の初期値 入―中6個,中―出3個 → 乱数で(うまくいかないみたいです)
/**乱数でうまくいかないとき**/
/*重み1つめ*/
v11=-0.3;
v12=-0.18;
v21=0.04;
v22=0.19;
v01=0.07;
v02=0.18;
/*重み2つめ*/
w1=0.05;
w2=-0.01;
w0=0.16;
/**重みの初期設定ここまで**/
学習データの入力(XOR)
入力をz1[??]とz2[??]に,出力をd[??]に入れておく
z1={0,0,1,1},z2={0,1,0,1},d={0,1,1,0}
しきい値(th=-1)
ita=0.1(くらい)
/**ここから学習ループ**/
for(i=0;i<10000;i++){
for(j=0;j<4;j++){ ←確認!!
5.前向き計算
//中間層の計算
netj1=z1[j]*v11+z2[j]*v12+th*v01;
y1=1/(1+exp(-netj1));
netj2=z1[j]*v21+z2[j]*v22+th*v02;
y2=1/(1+exp(-netj2));
//出力層の計算
netk=y1*w1+y2*w2+th*w0;
o=1/(1+exp(-netk));
e=d[j]-o;
6.重みの調整
delA=e*o*(1-o);
delB1=w1*delA*y1*(1-y1);
delB2=w2*delA*y2*(1-y2);
delB0=w0*delA*th*(1-th);
Dw1=ita*delA*y1;
Dw2=ita*delA*y2;
Dw0=ita*delA*th;
Dv11=ita*delB1*z1[j];
Dv21=ita*delB1*z2[j];
Dv12=ita*delB2*z1[j];
Dv22=ita*delB2*z2[j];
Dv01=ita*delB1*th;
Dv02=ita*delB2*th;
v11=v11+Dv11;
v21=v21+Dv21;
v12=v12+Dv12;
v22=v22+Dv22;
v01=v01+Dv01;
v02=v02+Dv02;
w1=w1+Dw1;
w2=w2+Dw2;
w0=w0+Dw0;
}//jループ終わり
}//iループ終わり
/**ここまで学習ループ**/
7.動作確認
前向き計算(5と同じ:「o」を出すまで)
入力にz1,z2=[0,0],[0,1],[1,0],[1,1]の4パターン入れてみて
出力(o)をprintfで4つ画面に出力
出力(o)がだいたい0,1,1,0となれば成功
[プログラム]
for(j=0;j<4;j++){
netj1=z1[j]*v11+z2[j]*v12+th*v01
printf("z1=%f,z2=%f,o=%lf\n",z1[j],z2[j],o );
}
↑こんな感じの結果がでたらOK