AMOS THE CREATOR

Merhaba arkadaşlar. Bu aydan itibaren AMOS yazımız biraz daha değişik olacak. Artık komutları tek tek açıklamak yerine örnek programlar vererek bu komutların kullanılışlarını ve değişik programlama tekniklerini göreceğiz.

Bu ay sizlere basit bir 'Neural Networks' programı veriyorum. 'Neural Networks' kelimelerinin Türkçe karşılığı, 'Sinir ağları'. Bu programlama tekniğinin temelini sinir sistemimizi oluşturan hücrelerin davranışını taklit etmek oluşturur. Bunun için bir sürü yöntem vardır. Bu ay sizlere bu yöntemlerin en eski ve en basit olanlarından biri olan Hopfield network yöntemini kullanan bir program veriyorum. Programda kullandığım katsayıların formüllerini 1 numaralı kutuda bulabilirsiniz. Eğer bu konuda daha derin bilgi sahibi olmak isterseniz, bunu mektuplarınızla bize bildirin. Eğer konu ilgi görürse daha derinlemesine anlatabilirim.

Şimdi gelelim bu ayki programa. Bu program bir çeşit şekil tanıma programıdır. Programın aslını hızlı çalışması için C dilinde yazdığımdan, pek süslemeye vaktim olmadı. Gelecek ay, AMOS'un grafik komutlarını kullanarak bu program için iyi bir 'User Interface' hazırlayacağım. Programa ilk olarak tanımasını istediğiniz şekilleri veriyorsunuz. Bunlar 8x8'lik kareler şeklindedir. Şekilleri bilgisayara satır satır giriyorsunuz. Ayrıntılı bilgiyi 2 numaralı kutuda bulabilirsiniz. Şekilleri girdikten sonra katsayıları belirliyorsunuz. Daha sonra bu şekillerden herhangi birini bilinmeyen olarak yüklüyorsunuz. Bu şekli 11 numaralı seçenekle gelişigüzel bir şekilde bozuyorsunuz. Bundan sonra program elde ettiğiniz yeni şeklin diğerlerinden en çok hangisine benzediğini adım adım buluyor. Benim elde ettiğim sonuçlara göre program %22'ye varan değişikliklerde bile iyi sonuç veriyor. Bu programın bir dezavantajı, belirli örnekler verildiğinde sonucun doğru yakalanamaması. Fakat yine de program birçok uygulama için uygun. Benim kendi kullandığım şekilleri 3 numaralı kutuda bulabilirsiniz.

Bu ay sadece programın listesini veriyorum. Daha detaylı açıklamasını gelecek ay vereceğim. Şimdilik hoşça kalın. Bu arada ufak bir uyarı: Program daha evvel yazdıklarıma göre epey uzun ve karışık o yüzden yazarken dikkat edin. Ufak bir işaret hatası yanlış çalışmasına sebep olabilir.....

Rern********************************* 
Rem Burak OZDEMIR 20 October 1991 * 
Rem 
Name:Hopfield 
network
* 
Rem Version: 1 
* 
Rem********************************** 
Set Buffer 30 INITSCRN Rem 
CLMNS=8 
RWS=8 
N_NODES=CLMNS*RWS 
N_SMPLRS=3 
UNKNOWN=N_SMPLRS 
RESULT=N_SMPLRS+1 
MXT=20 Rem Rem 
Dim SMPLR(N_SMPLRS+2,N_NODES) 
Dim W_MATRIX(N_NODES,N_NODES) 
Rem 
Global SMPLR(),W_MATRIX() 
Global CLMNS, RWS, N_NODES, N_SMPLRS, UNKNOWN, RE-
SULT, MXT Rem Do Cls
Print "Options: "  
Print"( 1)    Örnekleri gir"  
Print"( 2)    Örnekleri kayit et"  
Print"( 3)     Örnekleri yükle"  
Print "( 4)     Örnekleri yaz"  
Print: Print "( 5)     Katsayilari hesapla" 
Print"( 6)    katsayilari yaz"  
Print: Print"( 7)    Bilinmeyen sekli gir" 
Print"( 8)    Bilinmeyen sekli yükle" 
Print "( 9)     Bilinmeyen sekli kayit et" 
Print "(10)    Bilinmeyen sekli göster" 
Print: Print "(11)     Sekile gurultu ekle" 
Print:Print "(12)    Hesaplamaya basla" 
Print: Print"( 0)    Programdan cik" 
Rem 
Input OPTION  
If OPTION=0 Then Exit
If(OPTIONX) and OPTION<13) 
On OPTION Proc GT_SMPLRS, SV_ 
SMPLRS,LD_SMPLRS, PRT _ SMPLRS, 
SET_WEIGHTS, 
PRTJWEIGHTS, 
INP_ 
UNKNOWN, LD_UNKNOWN, SV_ UNK-
NOWN, SHW_UNKNOWN, AD_ NOISE, 
ITERATE
Else 
İLLEGAL 
Endlf 
Loop 
Rem 
Procedure AD_NOISE 
Cls 
Print: Print "Hata yüzdesini ver  " 
Input P 
ForI=0ToNJMODES-l 
T=Rnd(100) 
lf(T<P)
SMPLR(UNKNOWN,I)=-SMPLR 
(UN-
KNOWN,I)
Print "Altered bit     ",I 
Endlf 
Nextl 
Wait Key 
End Proc 
Rem 
Procedure INP_UNKNOWN 
Cls 
Print "Bilinmeyen sekli gir " 
INP_SAMPLE[UNKNOWN] 
SHW_SMPLR[UNKNOWN] 
End Proc 
Rem 
Rem 
Procedure SV_SMPLRS 
Cls 
Print "Örnek numarasini ver 
Input N 
N=N-1 
Print "isim ? 
Input NAMES 
OpenOut 1,NAMES 
ForI=0ToN_NODES-l 
Print #1,SMPLR(N,I) 
Next I 
Close 1 
End Proc 
Rem 
Procedure LD_SMPLRS 
Cls 
Print "Örnek numarasi 
Input N 
N=N-1 
Print "İsim ? 
Input NAMES 
Öpenin 1,NAMES 
ForI=0ToN_NODES-l 
Input #1,SMPLR(N,I) 
Nextl 
Close 1 
End Proc 
Rem 
Procedure LD_UNKNOWN 
Cls 
Print "isim ? 
Input NAMES 
Öpenin 1,NAMES 
ForI*ÖToN_NODES-l 
Inpuf#LSMPLR(UNKNOWN,I) 
Next f 
Close 1 
End Proc 
Rem 
Procedure SV_UNKNOWN 
Cls 
Print "isim    ? 
Input NAMES 
Öpen Out 1 ,NAME$ 
ForI=0ToN_NODES-l 
Print #1,SMPLR(N,I) 
Nextl
Close 1 
End Proc 
Rem 
Procedure GT_SMPLRS 
Cls 
Print 
Omek       numarasi       Max 
",N_SMPLRS
Input S 
If((S>0) and(S<=N_SMPLRS)) 
INP_SAMPLE[S-1] 
Else 
İLLEGAL 
Endlf 
End Proc 
Rem 
Procedure INP_SAMPLE[S] 
Cls 
Print "Örnek verilerini gir  " 
ForR=OToRWS-l 
Print "Satir    ";R; 
Input TEMPS 
ForC=OToCLMNS-l 
If Mid$(TEMP$,C+1,1 )=" I" 
SMPLR(S,R*CLMNS+C)=I 
Else 
SMPLR(S,R*CLMNS+C)=-1 
Endlf 
NextC 
NeXtR 
VVait Key 
End Proc 
Rem 
Procedure PRT^SMPLRS 
Cls 
Print  "Örnek    numarasini    ver    Max 
",N_SMPLRS
Input S 
If((S>0) and(S<=N_SMPLRS)) 
SHW_SMPLR[S-1J 
Else 
İLLEGAL 
Endlf 
End Proc 
Rem 
Procedure SHW_SMPLR[S] 
Cls 
Print "Omek   ",S+1 
ForR=OToRWS-l 
Print "Row     ";R; 
ForC=OToCLMNS-l 
If SMPLR(S,R*CLMNS+C)=1 
TEMP$="*" 
Else 
TEMP$=" " 
End t 
Prim TEMPS; 
NextC 
Print 
NextR 
Wait Key 
End Proc 
Rem 
Procedure SHW_UNKNOWN 
SHW_SMPLR[UNKNOWN] 
End Proc 
Rem 
Procedure SET_WEIGHTS 
Cls 
COUNT=0 
Print "Katsayilar hesaplaniyor" 
ForI=0ToN_NODES-I 
ForJ=0ToN_NODES-l 
W_MATRIX(I,J)=0 
If(IoJ) 
For S=0 To N_SMPLRS-1 
W_MATRIX(I,J)= 
W_MATRIX(U) 
+ 
(SMPLR(S,I) * SMPLR(S,J))
NextS 
Endlf 
Inc COUNT 
Next J 
Next I
Print "Katsayi adedi ",COUNT 
VVait Key 
End Proc 
Rem 
Procedure PRT_WEIGHTS 
Cls 
Print "Katsayi matrisi" 
ForI=0ToN_NODES-l 
Print 
ForJ=0ToN_NODES-l 
Print W_MATRIX(I,J) 
Next J 
Nextl 
VVait Key 
End Proc 
Rem 
Procedure ITERATE 
Cls 
ITERATlONS=0 
Print" Hesaplaniyor" 
Repeat 
Print 
SHW_SMPLR[UNKNOWN] 
ForN=0ToN_NODES-l 
SIGMA[N] 
TEMP=Param 
NLFUNC[TEMP] 
SMPLR(RESULT.N)=Param 
Next N 
Inc ITERATIONS 
COMPARE 
TEMP=Param 
If(TEMPoN_NODES) 
SWP_RESULT 
Endlf 
Until(ITERATIONS>MXT) or (TEMP = 
N_NODES)
Print "Islem tamam! Iterasyon say isi ".ITE-
RATIONS
Wait Key 
End Proc 
Procedure SIGMA[N] 
SUM=0 
ForI=0ToN_NODES-l 
SUM=SUM+ (W_MATRIX (N.I) * SMPLR 
(UNKNOWN.I))
Nextl 
End ProcfSUMj 
Rem 
Procedure NLFUNC[IN] 
If IN>=0 
Q=l 
Else 
Q=-l 
Endlf 
End Proc[Q] 
Procedure SWP_RESULT 
ForI=0ToN_NODES-l 
SMPLR(UNKNOWN,I) = SMPLR (RE-
SULT.I)
Next I 
End Proc 
Procedure COMPARE 
TEST=0 
ForI=0ToN_NODES-l 
If(SMPLR (UNKNOWN,I) = SMPLR (RE-
SULT.I))
Inc TEST 
Endlf 
Next I 
End Proc[TEST] 
Procedure İLLEGAL 
Cls 
Print "Hatali giriş, tekrar deneyin" 
End Proc 
Rem 
Procedure IN1TSCRN 
Screen Close 0 
Screen Öpen 0,640,200,2,Hires 
Cls 
Flash Off 
End Proc