サンプルプログラム
|
|
|
|
|
|
|
|
|
|
|
ニューラルネットワークのデモプログラムです、下をクリックしてください。
!パターン教示システムサンプルプログラム( 十進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 |