サンプルプログラム

 

       ニューラルネットワークのデモプログラムです、下をクリックしてください。

        ニューラルネットワークシミュレータ

 

!パターン教示システムサンプルプログラム( 十進BASIC)

!***アナログ出力対応バージョン***

 

DIM in(100)!入力信号

DIM tn(100)!教師信号

DIM on(100)!出力ユニット発火値

DIM oy(100)!出力ユニット前回発火値

DIM fo(100)!出力ユニット学習判定

DIM ro(100)!出力ユニット正解率

DIM mu(100)!中間ユニット発火値

DIM my(100)!中間ユニット計算値

DIM mc(100)!中間ユニット発火カウント

DIM fu(100)!中間ユニット学習判定

DIM hu(100)!中間ユニット閾値

DIM hb(100)!中間ユニット閾値の調整値

DIM ru(100)!中間ユニット正解率

DIM su(100)!中間ユニット収束率

DIM mw(100)!中間ユニット正の結合和

DIM wu(100,100)!入力〜中間ユニット結合値

DIM wo(100,100)!中間〜出力ユニット結合

 

!'係数設定

LET  np=0!'中間ユニット数(初期値0固定)

 

LET  k1=3!'中間ユニット閾値更新パラメーター

LET  k2=3!'入力〜中間ユニット結合更新パラメーター

LET  k3=5!'正解率、収束率更新パラメーター

LET  k4=5!'中間〜出力ユニット結合更新パラメーター

LET  hx=0.3!'閾値初期値

 

LET  nc=0 !'カウンタ

 

DO

   LET  nc=nc+1

   !'学習用信号設定

   !'入力値(テストパターン)

   RANDOMIZE

   FOR i=1 TO im

      LET  in(i)=INT(RND+0.5)

   NEXT i

   

   !'教示値(テストパターン)

   LET  tp=3

   !---------

   IF tp=1 THEN

   !NO1,AND 

      LET  om=1!'出力ユニット数

      LET  im=2!'入力数

      LET  tn(1)=in(1)*in(2)*0.5

   END IF

   IF tp=2 THEN

   !NO2,OR 

      LET  om=1!'出力ユニット数

      LET  im=2!'入力数

      IF  in(1)=1 OR in(2)=1 THEN LET  tn(1)=0.8 ELSE LET  tn(1)=0

   END IF

   IF tp=3 THEN

   !NO3,EXOR 

      LET  om=1!'出力ユニット数

      LET  im=2!'入力数

      IF  (in(1)*(1-in(2)))=1 OR (in(2)*(1-in(1)))=1 THEN LET  tn(1)=1 ELSE LET  tn(1)=0

   END IF

   IF tp=4 THEN

   !NO4,共有

      LET  om=2!'出力ユニット数

      LET  im=9!'入力数

      LET  k1=15

      LET  k2=10

      LET  k3=10

      LET tn(1)=0

      IF tn(1)=0 THEN LET tn(1)=(in(1)*in(2)*(1-in(3)))*0.6

      IF tn(1)=0 THEN LET tn(1)=(in(4)*in(5)*in(6))*0.8

      LET tn(2)=0

      IF tn(2)=0 THEN LET tn(2)=(in(1)*in(2)*(1-in(3)))*0.7

      IF tn(2)=0 THEN LET tn(2)=(in(7)*in(8)*in(9))*0.9

   END IF

   IF tp=5 THEN   

   !NO5,三項

      LET  om=1!'出力ユニット数

      LET  im=6!'入力数

      LET  k1=15

      LET  k2=10

      LET  k3=10

      LET tn(1)=0

      IF  tn(1)=0 THEN LET tn(1)=(in(1)*in(2))*0.5

      IF  tn(1)=0 THEN LET tn(1)=(in(3)*in(4))*0.7

      IF  tn(1)=0 THEN LET tn(1)=(in(5)*in(6))*0.9   

   END IF

   

   !**************************メインプログラム****************************

   !'発火計算

   !'中間ユニット発火計算

   FOR u=1 TO np

      LET  w1=0

      LET  w2=0

      LET  w3=0

      FOR i=1 TO im

         LET  w1=w1+wu(u,i)*in(i)

         IF wu(u,i)>0  THEN LET  w2=w2+wu(u,i)

         IF wu(u,i)>w3 THEN LET  w3=wu(u,i)

      NEXT i

      LET  my(u)=w1/(w2+0.01)

      LET  hb(u)=w3/(w2+0.01)

      IF my(u)>hu(u) THEN LET  mu(u)=1 ELSE LET  mu(u)=0

      IF mu(u)=1 THEN LET  mc(u)=mc(u)+1

      LET  mw(u)=w2

   NEXT u

   

   !'出力ユニット発火計算

   FOR n=1 TO om

      LET  on(n)=0

      FOR u=1 TO np

         LET  y=wo(n,u)*mu(u)

         IF y>on(n) THEN LET  on(n)=y

      NEXT u

   NEXT n

   

   !'Fo−出力ユニット判定

   FOR n=1 TO om

      LET  fo(n)=2*tn(n)-on(n)

      LET  fx=1-2*abs(tn(n)-on(n))

      LET  ro(n)=ro(n)+(fx-ro(n))/k3

   NEXT n

   

   !'Fu−中間ユニット判定

   FOR u=1 TO np

      LET  fu(u)=0

   NEXT u

   FOR n=1 TO om

   !'判定一致

      LET  y=0

      LET  no=0

      IF  tn(n)>0 THEN

         FOR u=1 TO np

         !'最大発火ユニット

            IF 0<wo(n,u) AND y<my(u) THEN

               LET  y=my(u)

               LET  no=u

            END IF

         NEXT u

      END IF

      !'最大のみFu=1

      IF no>0 THEN LET  fu(no)=1

   NEXT n

   

   !'中間ユニット閾値計算

   FOR u=1 TO np

      IF mu(u)=1 THEN

         IF fu(u)>0 THEN LET  hu(u)=hu(u)+(my(u)-hu(u)-hb(u)*0.5)/k1

         !------------------閾値計算---------------------------------

         IF fu(u)>0 THEN LET  su(u)=su(u)+(my(u)-su(u))/k3

         LET  ru(u)=ru(u)+(fu(u)-ru(u))/k3

      END IF

      !'入力〜中間ユニット結合値処理

      IF fu(u)>0 THEN

         FOR i=1 TO im

         !'判定Fu=1の場合に更新

            LET  d=fu(u)*(2*in(i)-1)-wu(u,i)

            LET  k=(abs(wu(u,i))+0.1)/k2 

            !---------------------------

            LET  wu(u,i)=wu(u,i)+d*k

         NEXT i

      END IF

   NEXT u

   

   !'中間〜出力ユニット結合値処理

   LET  z0=0

   FOR n=1 TO om

      LET  y=tn(n)-on(n)

      IF y>0 AND on(n)=0 THEN LET z=1 ELSE LET z=0

      FOR u=1 TO np

         LET  wo(n,u)=wo(n,u)+y*fu(u)/k4

         IF wo(n,u)<0 THEN LET wo(n,u)=0

         IF mu(u)>0 THEN LET z=0

      NEXT u

      !'結合作成(新たに中間ユニット使用)

      IF z=1 and z0=0 THEN

         LET  np=np+1

         LET  wo(n,np)=y

         FOR i=1 TO im

            LET  wu(np,i)=in(i)

         NEXT i

         LET  fu(np)=1

         LET  hu(np)=hx

         LET  z0=1

      END IF

   NEXT n

   !***********************************************************************

   

   !'計算結果表示

   SET WINDOW 0,80,39,-1

   CLEAR

   LET  a1$="----%"

   LET  a2$="-%.##"

   LET  a3$="%.##"

   LET  a4$="-%"

   LET  a5$="%.#"

   LET  a6$="-%.#"

   

   PLOT TEXT ,AT  0,25:"  wu"

   FOR u=1 TO np

      FOR i=1 TO im

         PLOT TEXT ,AT u*6-5,i+25:USING$(a6$,wu(u,i)/(mw(u)+0.1))

      NEXT i

   NEXT u

   PLOT TEXT ,AT  0,0:"np=       nc=                      wo"

   PLOT TEXT ,AT  5,0:USING$(a4$,np)

   PLOT TEXT ,AT 15,0:USING$(a1$,nc)

   FOR u=1 TO np

      PLOT TEXT ,AT  0,u+12:"no  my    f    h     r      s      hb     mc"

      PLOT TEXT ,AT  2,u+12:USING$(a4$,u)

      PLOT TEXT ,AT  7,u+12:USING$(a5$,my(u))

      PLOT TEXT ,AT 12,u+12:USING$(a4$,fu(u))

      PLOT TEXT ,AT 18,u+12:USING$(a3$,hu(u))

      PLOT TEXT ,AT 25,u+12:USING$(a2$,ru(u))

      PLOT TEXT ,AT 32,u+12:USING$(a2$,su(u))

      PLOT TEXT ,AT 41,u+12:USING$(a2$,hb(u))

      PLOT TEXT ,AT 49,u+12:USING$(a1$,mc(u))

   NEXT u

   FOR i=1 TO om

      PLOT TEXT ,AT  0,i:"no=   in=   on=   tn=   ro="   

      PLOT TEXT ,AT  3,i:USING$(a4$,i)

      PLOT TEXT ,AT  9,i:USING$(a4$,in(i))

      PLOT TEXT ,AT 16,i:USING$(a4$,on(i))

      PLOT TEXT ,AT 23,i:USING$(a4$,tn(i))

      PLOT TEXT ,AT 30,i:USING$(a2$,ro(i))

   NEXT i  

   FOR n=1 TO om

      FOR u=1 TO 10

         PLOT TEXT ,AT u*5+36,n:USING$(a6$,wo(n,u))

      NEXT u

   NEXT n

   

   !'学習収束判定

   LET  GE1=1

   FOR n=1 TO om

      IF ro(n)<0.9  THEN LET  GE1=0

      !-----------------------------

   NEXT n

   LET  GE2=0

   FOR n=1 TO om

      IF tn(n)>0 THEN LET  GE2=1

   NEXT n

   IF GE1=1 AND GE2=1 THEN EXIT DO

LOOP

END