Распознавание образов по методу Хебба |
Автор Administrator | |
01:08:2008 г. | |
Образы для распознавания: 101 010 010 101 101 010 Листинг программы:program HEBB; uses CRT; type mas=array [1..5,1..5] of real; {vec=array [1..2] of real;} bit = 0..1;{0-белая клетка, 1-черная клетка} const ETA = 0.01; {коэффициент обучения} NUM_TRAINING_PATTERNS = 2; ipt:array [1..NUM_TRAINING_PATTERNS,1..4,1..3] of bit= ( ((1,0,1),(0,1,0),(0,1,0),(1,0,1)), {Крестик} ((0,1,0),(1,0,1),(1,0,1),(0,1,0)));{Нолик} opt:array [1..2] of real=((0.9),(0.1)); var strengths: mas; ipt_TEST : mas; train_type : integer; training_run,Epoch,i: integer; t:byte; procedure initialise_strengths{инициализация связей}; var i,j : integer; begin for i:=1 to 4 do for j:=1 to 3 do strengths[i,j]:=random(1000)/1000 end; procedure Show_strengths{вывод на экран матрицы весовых коэффициентов}; var i: integer; begin for i:=1 to 4 do Writeln ('W[',i,',1]=',strengths[i,1]:3:2,' W[',i,',2]=',strengths[i,2]:3:2,' W[',i,',3]=',strengths[i,3]:3:2); end; procedure update_strengths{процедура обновления весовых коэффициентов}; var i,j,k : integer; begin for k:=1 to NUM_TRAINING_PATTERNS do for i:=1 to 4 do for j:=1 to 3 do strengths[i,j]:=strengths[i,j]+ ETA * ipt[k,i,j] * (2*opt[k]-1); if strengths[i,j] > 1 then strengths[i,j]:=1; if strengths[i,j] < 0 then strengths[i,j]:=0; end; procedure run_net{получение результата}; var i,j : integer; sum : real; begin sum:=0; for i:=1 to 4 do for j:=1 to 3 do sum := sum + strengths[i,j] * ipt_TEST[i,j]; writeln('Ответ сети',sum); if sum > 0.5 then writeln('сеть классифицирует образ как "Крестик"') else writeln('сеть классифицирует образ как "Нолик"') end; procedure input_pattern {Ввод образа для тестирования сети}; var i,j: integer; begin Writeln('Введите образ для распознавания (0-белая клетка,1-черная клетка)'); for i:=1 to 4 do for j:=1 to 3 do begin Writeln ('ВВЕДИТЕ ipt_TEST[',i,',',j,']'); Read (ipt_TEST[i,j]); end; end; Begin CLRSCR; initialise_strengths; Writeln('Матрица весовых коэффициентов после инициализации'); Writeln; Show_strengths; Writeln('Введите количество циклов обучения (10000)'); Read(Epoch); for training_run := 1 to Epoch do update_strengths; Writeln; Writeln('Матрица весовых коэффициентов после процесса обучения'); Writeln; Show_strengths; repeat input_pattern; run_net; writeln; Write('Завершить программу? 1-да, 2-нет :'); Readln(t); UNTIL t = 1; end. |