бесплатно рефераты
 

Сравнительный анализ нейросетевых реализаций алгоритмов распознавания образов

объясняет феномен обучения сети.

В процессе релаксации к одному из устойчивых состояний, сети с

обратными связями иллюстрируют ряд свойств, которые могут быть

интерпретированы как релаксация стимула, выработка прототипа,

бистабильность восприятия , которые показаны в данной работе на

реализованной модели.

Все программы созданы в DELPHI и работают в операционной среде Windows.

3. Методика и результаты экспериментальных исследований.

1 Проблема функции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Как было сказано, один из самых пессимистических результатов Минского

показывает, что однослойный персептрон не может воспроизвести такую простую

функцию как ИСКЛЮЧАЮЩЕЕ ИЛИ.

Для того, чтобы проиллюстрировать эту проблему, персептрону

предоставляли четыре обучающих пары. К одному классу образов относили,

подаваемое на измерительную сетчатку 5х7, шахматное поле и такое же поле,

но с инвертируемым цветом. К другому классу - буквенные символы E и F (см.

Рис.1 Приложение 1.). В результате распознавания персептрон классифицировал

первый из указанных образов как относящийся к первому классу, а второй,

третий и четвертый - ко второму. Т. е. персептрон ошибся на втором образе.

Эти же обучающие пары предоставили для обучения и распознавания модели

двухслойной сети. В результате сеть все образы классифицировала правильно.

Эти результаты согласуются с теорией представляемости персептрона и

двухслойных сетей.

2 Исследование представляемости однослойной и двухслойной нейронной

сети.

Исследование представляемости однослойной и двухслойной нейронных

сетей производились на соответствующих моделях.

Результаты эксперимента с моделью персептрона показали, что персептрон

способен моделировать функцию, разделяющую изображения цифр 1, 2, 3, 4, 5,

6, 7, 8 и 9, подаваемых на сетчатку, на два класса - четные и нечетные (см.

Рис. 2. Приложение 1.). Величина допустимой ошибки сети была равна 0.001.

Следующий эксперимент был поставлен для выяснения способности

персептрона и двухслойной сети обратного распространения классифицировать

буквенно-цифровые изображения (десять цифр и двадцать шесть букв латинского

алфавита) на два класса - цифры и буквы (см. Рис. 3. Приложение 1.). При

уровне допустимой ошибки 0.001 персептрон путал классами цифры 1, 3, 7 и

букву А. Сеть обратного распространения при том же уровне допустимой ошибки

0.001 путала классами цифры 3, 4, 5 и буквы S, I. Далее величина ошибки

уменьшалась на порядок. Персептрон путал класс цифры 1, сеть обратного

распространения - классами цифру 3 и буквы S, I. При уровне допустимой

ошибки 0.00001 персептрон путал классами цифру 1 . Сеть обратного

распространения при том же уровне допустимой ошибки 0.00001 путала класс

буквы S. При уровне допустимой ошибки 0.000001 и персептрон, и сеть

обратного распространения ошибок в классификации не допускали.

3 Релаксация стимула.

Как говорилось состояние сети Хопфилда описывается множеством текущих

значений сигналов от всех нейронов, причем на каждом шаге алгоритма

меняется состояние лишь одного нейрона, номер которого выбирается случайным

образом. Он суммирует с весами Wij сигналы, поступающие от выходов

нейронов сети по обратным связям и изменяет свое состояние в соответствии

со значением пороговой функции. Пример последовательности состояний,

которые проходит система нейронов при распознавании образов в модели

Хопфилда, приведен на рис. 4. Приложение 1, где показаны промежуточные

состояния. Левая картинка представляет собой исходный стимул, а крайняя

правая - образ, записанный в памяти системы. При такой релаксации энергия

системы уменьшается, достигая с течением времени одного из локальных

минимумов.

5 Возникновение ложного образа. Выработка прототипа.

Устойчивыми состояниями сети Хопфилда могут быть также образы, не

записанные ее память - ложные образы. На Рис. 5. Приложение 1. показан

пример устойчивого ложного образа ((), возникающий при распознавании

стимулов сетью, в матрице связей которой записаны образы a, b, c.

При увеличении числа образов, записываемых в память системы, отвечающие

им минимумы энергии могут сливаться. На рис. 6. Приложение 1. показана

группа образов (получающихся при небольших искажениях), записанные в память

сети - a, b, c. При предъявлении сети этих образов для распознавания, сеть

приходит к состоянию, соответствующего выработанному прототипу - d.

Модель демонстрирует процедуру разобучения, предназначенную для

устранения из памяти ложных образов. Разобучение состоит в предъявлении

сети образа, к которому релаксировал стимул. При этом из матрицы связи

вычитается тот член, который при обучении бы прибавлялся. В применении к

случаю прототипа с тремя записанными в памяти образами (см. Рис. 6.

Приложение 1.), разобучение приводит к исчезновению прототипа и к появлению

вместо одной потенциальной ямы, соответствующей прототипу, трех

потенциальных ям, соответствующих каждому образу, записанному в памяти

сети.

6 Бистабильность восприятия.

Эксперименты с моделью сети Хопфилда показали (см. Рис. 7. Приложение

1.), что средние стимулы последовательности могут восприниматься либо как

искаженный левый, либо как искаженный правый образы, т. е. имеет место

бистабильность восприятия. Смена устойчивого состояния происходит после

предъявления четвертой картинки.

Заключение.

В работе созданы программные модели трех нейронных сетей: персептрон,

сеть обратного распросранения и сеть Хопфилда. Модели позволяют

проиллюстрироваь основные достоинства и недостатки, а также ряд

специфических свойств реализованных моделей.

Во всех моделях для приложения внешнего стимула использовалась,

специально разработанная программно, измерительная сетчатка.

Результаты серии экспериментов, проведенных на моделях, показали,

что:

. Способность персептрона и сети обратного распространения моделировать

определенную функцию зависит от допустимой общей ошибки сети.

. Топологическая структура сети Хопфилда обуславливает ее свойства, которые

можно интерпритировать как релаксация стимула, выработка прототипа,

бистабильность восприятия.

В дальнейшем планируется разработка программных моделей более сложных

нейронных сетей и их комбинаций с целью получения наиболее эффективных

алгоритмов для задачи распознавания образов.

Литераура.

1.Горбань А.Н.,Россиев Д.А..Нейронные сети на персональном

компьюере.

2. Минский М.Л.,Пайперт С..Персепроны.М.: Мир.1971

3. Розенблатт Ф.Принципы нейродинамики.М.: Мир.1965

4. Уоссермен Ф.Нейрокомпьютерная техника.М.: Мир.1992.237С

5. Cohen M.A.,Grossberg S.G.Absoiute stability of global pattern

formation and parallel memory storage by compatitive neural

networks.1983

6. Hebb D.O.Organization of behavior.New York:Science Edition

7. Hopfield J.J.Neural networks and physical systems with emergent

collective computational abilities. Proseedings of the National

Academy of Science 79.1982

8. Parker D.B. Learning-logic. Invention Report. 1982

9. Rumelhart D.E. Hinton G.E.,Williams R.J. Learning internal

representations by error propagation. In Parallel distributed

processing, vol.1986

10. Werbos P.G. Beyond regression: New tools for prediction and analysis

in the behavioral sciences. 1974

11. Wider R.O. Single-stage logic, Paper presented at the AIEE Fall

General Meeting. 1960

12. Windrow B. The speed of adaptetion in adaptive control system. 1961

13. Windrow B. A statistical theory of adaptetion. Adaptive control

systems. 1963

14. Windrow B., Angell J.B. Reliable, trainable networks for computing and

control. 1962

15. Windrow B., Hoff N.E. Adaptive switching circuits. 1960

Приложение 1.

[pic]

[pic]

[pic]

[pic]

Рис. 1.

[pic] [pic] [pic]

[pic] [pic] [pic]

[pic] [pic] [pic]

Рис. 2.

[pic] [pic] [pic] [pic]

[pic] [pic] [pic] [pic]

[pic] [pic] [pic] [pic]

[pic] [pic] [pic] [pic]

Рис. 3.

[pic] [pic] [pic] [pic]

[pic] [pic] [pic] [pic]

[pic] [pic]

[pic]

Рис. 3.

[pic] [pic]

[pic] [pic]

[pic]

Рис. 4.

[pic]

[pic]

[pic]

[pic]

Рис. 5.

[pic]

[pic]

[pic]

[pic]

Рис. 6.

[pic] [pic] [pic]

[pic] [pic] [pic]

Рис. 7.

Приложение 2.

Программа, моделирующая однослойную сеть.

unit UPerc;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs,

Percept_Field, StdCtrls, Buttons, ExtCtrls;

const InputLayerUnits=35;

OutputLayerUnits=2;

eta=0.05;

epsilon=0.000001;

numberpatterns=36;

type

TFrmPerceptron = class(TForm)

Percept_FieldPerc: TPercept_Field;

GroupBoxTrain: TGroupBox;

GroupBoxInit: TGroupBox;

ComboBoxABC: TComboBox;

ComboBoxDigits: TComboBox;

BtnNext: TButton;

BitBtnClose: TBitBtn;

EditNumPat: TEdit;

LabelNumPat: TLabel;

GroupBoxRec: TGroupBox;

LabelInput: TLabel;

BtnOutput: TButton;

LabelOdd: TLabel;

RadioGroupTarget: TRadioGroup;

RadioButtonOdd: TRadioButton;

RadioButtonEven: TRadioButton;

LabelOr: TLabel;

LabelEven: TLabel;

procedure ComboBoxABCChange(Sender: TObject);

procedure ComboBoxDigitsChange(Sender: TObject);

procedure Percept_FieldPercMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure BitBtnCloseClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure BtnNextClick(Sender: TObject);

procedure BtnOutputClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FrmPerceptron: TFrmPerceptron;

var

w:array[1..OutputLayerUnits,1..InputLayerUnits] of real;

indexBtnNextClick:byte;

activation:array[1..OutputLayerUnits] of real;

OutputLayerOutput:array[1..OutputLayerUnits] of shortint;

target:array[1..numberpatterns,1..OutputLayerUnits] of shortint;

v:array[1..numberpatterns,1..InputLayerUnits] of shortint;

implementation

{$R *.DFM}

procedure TFrmPerceptron.Percept_FieldPercMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var m,k:BYTE;

correctRect:shortint;

L,T,H,V:INTEGER;

begin

L:=0;

T:=0;

H:=Percept_FieldPerc.UnitHorizontal;

V:=Percept_FieldPerc.UnitVertical;

for m :=1 to Percept_FieldPerc.UnitRectVert do

begin

for k :=1 to Percept_FieldPerc.UnitRectHorz do

begin

if (XL) and (YT) then

begin

correctRect:=k+Percept_FieldPerc.UnitRectHorz*(m-1);

if (Button=mbLeft) and

(Percept_FieldPerc.Brushes[correctRect]=Percept_FieldPerc.BackGroundBr

ush) then

begin

Percept_FieldPerc.Brushes[correctRect]:=Percept_FieldPerc.RectBrush;

end

else

if (Button=mbRight) and

(Percept_FieldPerc.Brushes[correctRect]=Percept_FieldPerc.RectBrush)th

en

begin

Percept_FieldPerc.Brushes[correctRect]:=Percept_FieldPerc.BackGroundBr

ush;

end;

end;

inc(L,Percept_FieldPerc.UnitHorizontal);

inc(H,Percept_FieldPerc.UnitHorizontal);

end;

inc(T,Percept_FieldPerc.UnitVertical);

inc(V,Percept_FieldPerc.UnitVertical);

L:=0;

H:=Percept_FieldPerc.UnitHorizontal;

end;

end;

procedure TFrmPerceptron.BitBtnCloseClick(Sender: TObject);

begin

Close;

end;

procedure TFrmPerceptron.FormCreate(Sender: TObject);

var i,j:byte;

rand:real;

begin

//numberpatterns:=2;//10;

EditNumPat.Text:=inttostr(numberpatterns);

BtnNext.Font.Color:=clRed;

indexBtnNextClick:=0;

LabelInput.Visible:=False;

// *********************************************

Randomize;// случайные веса (-0.5,0.5)

for i := 1 to OutputLayerUnits do

begin

for j := 1 to InputLayerUnits do

begin

rand:=Random-0.5;

w[i,j]:=rand;

end;

end;

end;

procedure TFrmPerceptron.BtnNextClick(Sender: TObject);

var i,j,m:byte;

sum:real;

neterror,err:real;

error:array[1..OutputLayerUnits] of real;

stop:boolean;

krandom:integer;

begin

indexBtnNextClick:=indexBtnNextClick+1;

for m:=1 to InputLayerUnits do begin

if (Percept_FieldPerc.Brushes[m]=Percept_FieldPerc.RectBrush)

then

begin

v[indexBtnNextClick,m]:=1;

end

else

if

(Percept_FieldPerc.Brushes[m]=Percept_FieldPerc.BackGroundBrush) then

begin

v[indexBtnNextClick,m]:=-1;

end;

end;

// ******************ODD or EVEN*********************

if RadioButtonOdd.Checked then

begin

target[indexBtnNextClick,1]:=1;

target[indexBtnNextClick,2]:=-1;

end

else

if RadioButtonEven.Checked then

begin

target[indexBtnNextClick,1]:=-1;

target[indexBtnNextClick,2]:=1;

end;

// ***************************************************

if (indexBtnNextClick+1)=numberpatterns then

begin

BtnNext.Caption:='last';

end

else

begin

if (indexBtnNextClick)=numberpatterns then

begin

BtnNext.Font.Color:=clWindowText;

BtnNext.Caption:='finished';

LabelInput.Font.Color:=clRed;

LabelInput.Visible:=True;

end

else

begin

BtnNext.Caption:='next';

end;

end;

//*********************MAIN*******************************

if (indexBtnNextClick)=numberpatterns then

begin

repeat

stop:=false;

for m := 1 to numberpatterns do

begin

for i := 1 to OutputLayerUnits do

begin

sum:=0;

for j := 1 to InputLayerUnits do

begin

sum:=sum+w[i,j]*v[m,j];

end;

activation[i]:=sum;

if sum>=0 then

begin

OutputLayerOutput[i]:=1;

end

else

begin

OutputLayerOutput[i]:=-1;

end;

end;

neterror:=0;

for i := 1 to OutputLayerUnits do

begin

err:=target[m,i]-activation[i];

error[i]:=err;

neterror:=neterror+0.5*sqr(err);

end;

if neterror=0 then

begin

OutputLayerOutput[i]:=1;

end

else

begin

OutputLayerOutput[i]:=-1;

end;

end;

neterror:=0;

for i := 1 to OutputLayerUnits do

begin

err:=target[m,i]-activation[i];

error[i]:=err;

neterror:=neterror+0.5*sqr(err);

end;

for i := 1 to OutputLayerUnits do

begin

for j := 1 to InputLayerUnits do

begin

w[i,j]:=w[i,j]+eta*error[i]*v[m,j];

end;

end;

end;

end;//if

until stop;//end;

end; // if

end;

procedure TFrmPerceptron.BtnOutputClick(Sender: TObject);

var z:array[1..InputLayerUnits] of shortint;

m,i,j:byte;

Output:array[1..InputLayerUnits] of real;

sum:real;

begin

for m:=1 to InputLayerUnits do begin

if (Percept_FieldPerc.Brushes[m]=Percept_FieldPerc.RectBrush)

then

begin

z[m]:=1;

end

else

if

(Percept_FieldPerc.Brushes[m]=Percept_FieldPerc.BackGroundBrush) then

begin

z[m]:=-1;

end;

end;

for i := 1 to OutputLayerUnits do

begin

sum:=0;

for j := 1 to InputLayerUnits do

begin

sum:=sum+w[i,j]*z[j];

end;

Output[i]:=sum;

end;

if (Output[1]>Output[2]) then

begin

LabelOdd.Font.Color:=clRed;

LabelEven.Font.Color:=clWindowText;

end

else begin

if (Output[2]>Output[1]) then

begin

LabelEven.Font.Color:=clRed;

LabelOdd.Font.Color:=clWindowText;

end;

end;

end;

end.

Программа, моделирующая сеть обратного распространения

unit UBack;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs,

StdCtrls, Percept_Field, Buttons, ExtCtrls;

const FirstLayerUnits=35;

SecondLayerUnits=20;

ThirdLayerUnits=2;

numberpatterns=36;

NumLayers=3;

epsilon=0.000001;

eta=0.05;

alpha=0.5;

type

TFrmBack = class(TForm)

BitBtnClose: TBitBtn;

Percept_FieldBack: TPercept_Field;

GroupBoxTrain: TGroupBox;

ComboBoxABC: TComboBox;

ComboBoxDigits: TComboBox;

GroupBoxInit: TGroupBox;

EditNumPat: TEdit;

LabelNumPat: TLabel;

BtnNext: TButton;

GroupBoxRec: TGroupBox;

LabelInput: TLabel;

RadioGroupTarget: TRadioGroup;

RadioButtonLetter: TRadioButton;

RadioButtonFigure: TRadioButton;

ButtonOut: TButton;

LabelFigure: TLabel;

LabelOr: TLabel;

LabelLetter: TLabel;

procedure BitBtnCloseClick(Sender: TObject);

procedure ComboBoxABCChange(Sender: TObject);

procedure ComboBoxDigitsChange(Sender: TObject);

procedure Percept_FieldBackMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure FormCreate(Sender: TObject);

procedure BtnNextClick(Sender: TObject);

procedure ButtonOutClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FrmBack: TFrmBack;

var

wFirstSecond:array[1..SecondLayerUnits,1..FirstLayerUnits] of real;

wSecondThird:array[1..ThirdLayerUnits,1..SecondLayerUnits] of real;

indexBtnNextClick:byte;

target:array[1..numberpatterns,1..ThirdLayerUnits] of real;

v:array[1..numberpatterns,1..FirstLayerUnits] of real;

implementation

{$R *.DFM}

procedure TFrmBack.BitBtnCloseClick(Sender: TObject);

begin

Close;

end;

procedure TFrmBack.Percept_FieldBackMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var m,k:BYTE;

correctRect:shortint;

L,T,H,V:INTEGER;

begin

L:=0;

T:=0;

H:=Percept_FieldBack.UnitHorizontal;

V:=Percept_FieldBack.UnitVertical;

for m :=1 to Percept_FieldBack.UnitRectVert do

begin

for k :=1 to Percept_FieldBack.UnitRectHorz do

begin

if (XL) and (YT) then

begin

correctRect:=k+Percept_FieldBack.UnitRectHorz*(m-1);

if (Button=mbLeft) and

(Percept_FieldBack.Brushes[correctRect]=Percept_FieldBack.BackGroundBr

ush) then

begin

Percept_FieldBack.Brushes[correctRect]:=Percept_FieldBack.RectBrush;

end

else

if (Button=mbRight) and

(Percept_FieldBack.Brushes[correctRect]=Percept_FieldBack.RectBrush)th

en

begin

Percept_FieldBack.Brushes[correctRect]:=Percept_FieldBack.BackGroundBr

ush;

end;

end;

inc(L,Percept_FieldBack.UnitHorizontal);

inc(H,Percept_FieldBack.UnitHorizontal);

end;

inc(T,Percept_FieldBack.UnitVertical);

inc(V,Percept_FieldBack.UnitVertical);

L:=0;

H:=Percept_FieldBack.UnitHorizontal;

end;

end;

procedure TFrmBack.FormCreate(Sender: TObject);

var i,j:byte;

rand:real;

begin

EditNumPat.Text:=inttostr(numberpatterns);

BtnNext.Font.Color:=clRed;

indexBtnNextClick:=0;

LabelInput.Visible:=False;

// *********************************************

Randomize;// случайные веса (-0.5,0.5)

for i := 1 to SecondLayerUnits do

begin

for j := 1 to FirstLayerUnits do

begin

rand:=Random-0.5;

wFirstSecond[i,j]:=rand;

end;

end;

for i := 1 to ThirdLayerUnits do

begin

for j := 1 to SecondLayerUnits do

begin

rand:=Random-0.5;

wSecondThird[i,j]:=rand;

end;

end;

end;

procedure TFrmBack.BtnNextClick(Sender: TObject);

var i,j,m:byte;

sumFirstSecond,

sumSecondThird:real;

stop:boolean;

OutputSecond:array[1..SecondLayerUnits] of real;

OutputThird:array[1..ThirdLayerUnits] of real;

output,err,neterror:real;

OutLayerError:array[1..ThirdLayerUnits] of real;

SecondLayerError:array[1..SecondLayerUnits] of real;

FirstLayerError:array[1..FirstLayerUnits] of real;

dWeightSecondThird:array[1..ThirdLayerUnits,1..SecondLayerUnits]

of real;

dWeightFirstSecond:array[1..SecondLayerUnits,1..FirstLayerUnits]

of real;

dWeight:real;

krandom:integer;

begin

indexBtnNextClick:=indexBtnNextClick+1;

for m:=1 to FirstLayerUnits do begin

if (Percept_FieldBack.Brushes[m]=Percept_FieldBack.RectBrush)

then

begin

v[indexBtnNextClick,m]:=1;

end

else

if

(Percept_FieldBack.Brushes[m]=Percept_FieldBack.BackGroundBrush) then

begin

v[indexBtnNextClick,m]:=-1;

end;

end;

// ******************ODD or EVEN*********************

if RadioButtonFigure.Checked then

begin

target[indexBtnNextClick,1]:=0.9;//1;

target[indexBtnNextClick,2]:=0.1;//-1;

end

else

if RadioButtonLetter.Checked then

begin

target[indexBtnNextClick,1]:=0.1;//-1;

target[indexBtnNextClick,2]:=0.9;//1;

end;

// ***************************************************

if (indexBtnNextClick+1)=numberpatterns then

begin

BtnNext.Caption:='last';

end

else

begin

if (indexBtnNextClick)=numberpatterns then

begin

BtnNext.Font.Color:=clWindowText;

BtnNext.Caption:='finished';

LabelInput.Font.Color:=clRed;

LabelInput.Visible:=True;

end

else

begin

BtnNext.Caption:='next';

end;

end;

//***********************MAIN**************************

if (indexBtnNextClick)=numberpatterns then

begin

repeat

stop:=false;

for m := 1 to numberpatterns do

begin

for i := 1 to SecondLayerUnits do

begin

sumFirstSecond:=0;

for j := 1 to FirstLayerUnits do

begin

sumFirstSecond:=sumFirstSecond+wFirstSecond[i,j]*v[m,j];

end;

OutputSecond[i]:=1/(1+exp(-sumFirstSecond));

end;

for i := 1 to ThirdLayerUnits do

begin

sumSecondThird:=0;

for j := 1 to SecondLayerUnits do

begin

sumSecondThird:=sumSecondThird+wSecondThird[i,j]*OutputSecond[j];

end;

OutputThird[i]:=1/(1+exp(-sumSecondThird));

end;

neterror:=0;

for i := 1 to ThirdLayerUnits do

begin

output:=OutputThird[i];

err:=target[m,i]-output;

OutLayerError[i]:=output*(1-output)*err;

neterror:=neterror+0.5*sqr(err);

end;

if neterrorOutputThird[2]) then

begin

LabelFigure.Font.Color:=clRed;

LabelLetter.Font.Color:=clWindowText;

end

else begin

if (OutputThird[2]>OutputThird[1]) then

begin

LabelLetter.Font.Color:=clRed;

LabelFigure.Font.Color:=clWindowText;

end;

end;

end;

end.

Программа, моделирующая сеть Хопфилда

unit UHop;

interface

uses

Windows, Messages, SysUtils,

Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls, Buttons, Percept_Field;

const numberneurons=35;

type

TFrmHop = class(TForm)

BitBtnClose: TBitBtn;

GrpBoxTraining: TGroupBox;

GrpBoxInitial: TGroupBox;

EditThres: TEdit;

EditNumPat: TEdit;

LabelThres: TLabel;

LabelNumPat: TLabel;

BtnNext: TButton;

GrpBoxRec: TGroupBox;

LabelInput: TLabel;

BtnOutput: TButton;

BitBtnCancel: TBitBtn;

ButtonDelay: TButton;

ComboBoxABC: TComboBox;

ComboBoxDigits: TComboBox;

Percept_FieldHop: TPercept_Field;

ButtonRetrain: TButton;

procedure Percept_FieldHopMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure BitBtnCloseClick(Sender: TObject);

procedure EditNumPatChange(Sender: TObject);

procedure EditThresChange(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure BtnNextClick(Sender: TObject);

procedure BtnOutputClick(Sender: TObject);

procedure BitBtnCancelClick(Sender: TObject);

procedure ButtonDelayClick(Sender: TObject);

procedure ComboBoxABCChange(Sender: TObject);

procedure ComboBoxDigitsChange(Sender: TObject);

procedure ButtonRetrainClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FrmHop: TFrmHop;

var numberpatterns,threshold:shortint;

w:array[1..numberneurons,1..numberneurons] of shortint;

iindex,jindex,indexBtnNextClick:byte;

stop:boolean;

implementation

{$R *.DFM}

procedure TFrmHop.Percept_FieldHopMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var m,k:BYTE;

correctRect:shortint;

L,T,H,V:INTEGER;

begin

L:=0;

T:=0;

H:=Percept_FieldHop.UnitHorizontal;

V:=Percept_FieldHop.UnitVertical;

for m :=1 to Percept_FieldHop.UnitRectVert do

begin

for k :=1 to Percept_FieldHop.UnitRectHorz do

begin

if (XL) and (YT) then

begin

correctRect:=k+Percept_FieldHop.UnitRectHorz*(m-1);

if (Button=mbLeft) and

(Percept_FieldHop.Brushes[correctRect]=Percept_FieldHop.BackGroundBrus

h) then

begin

Percept_FieldHop.Brushes[correctRect]:=Percept_FieldHop.RectBrush;

end

else

if (Button=mbRight) and

(Percept_FieldHop.Brushes[correctRect]=Percept_FieldHop.RectBrush)then

begin

Percept_FieldHop.Brushes[correctRect]:=Percept_FieldHop.BackGroundBrus

h;

end;

end;

inc(L,Percept_FieldHop.UnitHorizontal);

inc(H,Percept_FieldHop.UnitHorizontal);

end;

inc(T,Percept_FieldHop.UnitVertical);

inc(V,Percept_FieldHop.UnitVertical);

L:=0;

H:=Percept_FieldHop.UnitHorizontal;

end;

end;

procedure TFrmHop.BitBtnCloseClick(Sender: TObject);

begin

Close;

end;

procedure TFrmHop.EditThresChange(Sender: TObject);

begin

threshold:=strtoint(EditThres.Text);

end;

procedure TFrmHop.EditNumPatChange(Sender: TObject);

begin

numberpatterns:=strtoint(EditNumPat.Text);

end;

procedure TFrmHop.FormCreate(Sender: TObject);

var i,j:byte;

begin

threshold:=0;

EditThres.Text:=inttostr(threshold);

numberpatterns:=3;

EditNumPat.Text:=inttostr(numberpatterns);

BtnNext.Font.Color:=clRed;

for i:=1 to numberneurons do begin

for j:=1 to numberneurons do begin

w[i,j]:=0;

end;

end;

indexBtnNextClick:=0;

LabelInput.Visible:=False;

end;

procedure TFrmHop.BtnNextClick(Sender: TObject);

var i,j,m:byte;

v:array[1..numberneurons] of shortint;

begin

indexBtnNextClick:=indexBtnNextClick+1;

for m:=1 to numberneurons do begin

if (Percept_FieldHop.Brushes[m]=Percept_FieldHop.RectBrush) then

begin

v[m]:=1;

end

else

if (Percept_FieldHop.Brushes[m]=Percept_FieldHop.BackGroundBrush)

then

begin

v[m]:=0;

end;

end;

for i:=1 to numberneurons-1 do begin

for j:=i+1 to numberneurons do begin

w[i,j]:=w[i,j]+(2*v[i]-1)*(2*v[j]-1);

w[j,i]:=w[i,j];

end;

end;

if (indexBtnNextClick+1)=numberpatterns then

begin

BtnNext.Caption:='last';

end

else

begin

if (indexBtnNextClick)=numberpatterns then

begin

BtnNext.Font.Color:=clWindowText;

BtnNext.Caption:='finished';

LabelInput.Font.Color:=clRed;

LabelInput.Visible:=True;

end

else

begin

BtnNext.Caption:='next';

end;

end;

end;

procedure TFrmHop.BtnOutputClick(Sender: TObject);

var i,j,m,indicator:byte;

y,z:array[1..numberneurons] of shortint;

wij,wijthres:shortint;

k:longint;

begin

for m:=1 to numberneurons do begin

if (Percept_FieldHop.Brushes[m]=Percept_FieldHop.RectBrush) then

begin

z[m]:=1;

end

else

if (Percept_FieldHop.Brushes[m]=Percept_FieldHop.BackGroundBrush)

then

begin

z[m]:=0;

end;

end;

for m := 1 to numberneurons do

begin

y[m]:=z[m];

end;

indicator:=0;

while indicator=0 do begin

for i:=1 to numberneurons do begin

wij:=0;

for j:=1 to numberneurons do begin

if i<>j then

wij:=wij+w[i,j]*z[j];

end;

wijthres:=wij-threshold;

if wijthres>=0 then

z[i]:=1

else

z[i]:=0;

end;

i:=1;

while inumberneurons;

end;

end;{while}

end;{while}

for m := 1 to numberneurons do

begin

if z[m]=1 then

begin

Percept_FieldHop.Brushes[m]:=Percept_FieldHop.RectBrush;

end

else

if z[m]=0 then

begin

Percept_FieldHop.Brushes[m]:=Percept_FieldHop.BackGroundBrush;

end;

stop:=false;

repeat

Application.ProcessMessages;

until stop;

end;

end;

procedure TFrmHop.BitBtnCancelClick(Sender: TObject);

var i,j:byte;

begin

BtnNext.Font.Color:=clRed;

for i:=1 to numberneurons do begin

for j:=1 to numberneurons do begin

w[i,j]:=0;

end;

end;

indexBtnNextClick:=0;

LabelInput.Visible:=False;

BtnNext.Caption:='first';

for i := 1 to numberneurons do

begin

Percept_FieldHop.Brushes[i]:=Percept_FieldHop.BackGroundBrush;

end;

end;

procedure TFrmHop.ButtonDelayClick(Sender: TObject);

begin

stop:=true;

end;

procedure TFrmHop.ButtonRetrainClick(Sender: TObject);

var i,j,m:byte;

v:array[1..numberneurons] of shortint;

begin

for m:=1 to numberneurons do begin

if (Percept_FieldHop.Brushes[m]=Percept_FieldHop.RectBrush) then

begin

v[m]:=1;

end

else

if (Percept_FieldHop.Brushes[m]=Percept_FieldHop.BackGroundBrush)

then

begin

v[m]:=0;

end;

end;

for i:=1 to numberneurons-1 do begin

for j:=i+1 to numberneurons do begin

w[i,j]:=w[i,j]-(2*v[i]-1)*(2*v[j]-1);

w[j,i]:=w[i,j];

end;

end;

end;

end.

Страницы: 1, 2


ИНТЕРЕСНОЕ



© 2009 Все права защищены.