誤差逆伝搬法のプログラム
**ループの設定でミスがありました.赤字部分を要確認
 

2入力1出力(中間層2)の階層型ニューラルネットワーク(信号と重みの名前)

 

 

プログラム例(の方針)

1.関数の宣言

2.変数の定義

3.初期化

4.初期値の設定

結合加重の初期値 入―中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

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))

    printf("z1=%f,z2=%f,o=%lf\n",z1[j],z2[j],o );

}

 

 

↑こんな感じの結果がでたらOK

 

 

 

inserted by FC2 system