Rakitskij
Sergey AS-15
1. My Hopfield neural network can store & recognize 7 images. Images resolution are 10x10 pixels. The maximal noise is 34%.
1. 2. 3.
|
|
|
|
4. 5. 6.
|
|
|
|
7.

Train with 3 patterns: Training completed
successfully. Noise=34%
|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
|
1 |
|
|
|
|
|
|
|
|
|
2 |
|
|
|
Train with
3 patterns. Noise=40%
|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
|
1 |
|
|
|
|
|
|
|
|
|
2 |
|
|
|
Train with
7 patterns. Noise=0%
|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
Pattern4 |
Pattern5 |
Pattern6 |
Pattern7 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
Result |
success |
success |
success |
success |
success |
success |
success |
Train with
7 patterns. Noise=8%
|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
Pattern4 |
Pattern5 |
Pattern6 |
Pattern7 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
Result |
successful |
successful |
successful |
successful |
successful |
successful |
successful |
Train with
7 patterns. Noise=22%
|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
Pattern4 |
Pattern5 |
Pattern6 |
Pattern7 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
Result |
successful |
successful |
successful |
unsuccessful |
successful |
successful |
successful |
Train with
7 patterns. Noise=34%
|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
Pattern4 |
Pattern5 |
Pattern6 |
Pattern7 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
Result |
successful |
successful |
unsuccessful |
unsuccessful |
unsuccessful |
successful |
successful |
Train with
8 patterns. Noise=22%, where pattern 8:

|
Iteration |
Pattern1 |
Pattern2 |
Pattern3 |
Pattern4 |
Pattern5 |
Pattern6 |
Pattern7 |
Pattern8 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
Result |
successful |
successful |
successful |
unsuccessful |
unsuccessful |
successful |
successful |
unsuccessful |
Program:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
ExtCtrls, Spin;
type
private
{ Private
declarations }
public
{ Public
declarations }
end;
const N=10;
type TPattern=array
[1..N,1..N] of byte;
var
CurPattern:byte=1;
PatternCount:byte=1;
Patterns:array [1..15] of TPattern;
InPattern:TPattern;
W:array[1..N*N,1..N*N] of real;
var
Form1: TForm1;
function Sign(x:real):real;
Procedure showInPattern;
implementation
uses Unit2;
function Sign(x:real):real;
begin
if
x>0
then
Sign:=1
else
Sign:=-1;
end;
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
begin
form2.show;
end;
procedure TForm1.FormCreate(Sender:
TObject);
begin
ReadPatterns;
SpinEdit3.MaxValue:=PatternCount;
SpinEdit1.MaxValue:=SpinEdit3.value;
InPattern:=Patterns[1];
showinPattern;
end;
Procedure showInPattern;
var
i,j:Integer;
begin
with
Form1.Image1.Canvas do
begin
brush.Color:=clWhite;
FillRect(rect(0,0,20*N,20*N));
for
i:=1 to N do
for
j:=1 to N do
begin
if
InPattern[i,j]=1
then
brush.Color:=clBlack
else
brush.Color:=clWhite;
FillRect(rect((j-1)*20,(i-1)*20,j*20,i*20));
end;
end;//whith
end;//Procedure
procedure
TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
var
i,j:byte;
begin
j:=(X
div 20)+1;
i:=(Y div 20)+1;
if InPattern[i,j]=1
then
InPattern[i,j]:=0
else
InPattern[i,j]:=1;
showinPattern;
end;
procedure
TForm1.SpinEdit3Change(Sender: TObject);
begin
SpinEdit1.MaxValue:=SpinEdit3.value;
end;
procedure
TForm1.SpinEdit1Change(Sender: TObject);
begin
InPattern:=Patterns[SpinEdit1.Value];
showInPattern;
end;
procedure TForm1.Button2Click(Sender:
TObject);
var
i,j:byte;
begin
Randomize;
for i:=1 to N do
for
j:=1 to N do
if
Random(101)<SpinEdit2.Value
then
if
InPattern[i,j]=1
then
InPattern[i,j]:=0
else
InPattern[i,j]:=1;
showInPattern;
end;
procedure TForm1.Button3Click(Sender:
TObject);
var
i,j,p:Integer;
begin
for i:=1 to sqr(N) do
for
j:=1 to sqr(N) do
begin
W[i,j]:=0;
for
p:=1 to form1.spinEdit3.value do
W[i,j]:=W[i,j]+(sign(Patterns[p][((i-1) div N)+1,((i-1) mod
N)+1]-0.5)*sign(Patterns[p][((j-1) div N)+1,((j-1) mod N)+1]-0.5));
{ if i=j
then
W[i,j]:=0;
}
end;
end;
procedure TForm1.Button4Click(Sender:
TObject);
var
i,j:Integer;
s:real;
begin
for i:=1 to sqr(N) do
begin
S:=0;
for
j:=1 to sqr(N) do
S:=S+(W[i,j]*sign(InPattern[((j-1) div
N)+1,((j-1) mod N)+1]-0.5));
InPattern[((i-1) div
N)+1,((i-1) mod N)+1]:=round((Sign(S)+1)/2);
end;
showInPattern;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
ExtCtrls;
type
TForm2 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure
Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure
Button5Click(Sender: TObject);
procedure
Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
procedure
Button2Click(Sender: TObject);
procedure
Button1Click(Sender: TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
Procedure showCurrentPattern;
Procedure SavePatterns;
Procedure ReadPatterns;
var
Form2: TForm2;
implementation
uses unit1;
{$R *.DFM}
procedure TForm2.Button4Click(Sender:
TObject);
begin
inc(PatternCount);
CurPattern:=PatternCount;
showCurrentPattern;
end;
procedure TForm2.Button3Click(Sender:
TObject);
begin
if CurPattern>1
then
dec(CurPattern);
showCurrentPattern;
end;
Procedure showCurrentPattern;
var
i,j:byte;
begin
Form2.Caption:='pattern '+inttostr(CurPattern)+'/'+inttostr(PatternCount);
with
Form2.Image1.{Picture.Bitmap.}Canvas do
begin
brush.Color:=clWhite;
FillRect(rect(0,0,20*N,20*N));
for
i:=1 to N do
for
j:=1 to N do
begin
if
Patterns[CurPattern][i,j]=1
then
brush.Color:=clBlack
else
brush.Color:=clWhite;
FillRect(rect((j-1)*20,(i-1)*20,j*20,i*20));
end;
end;//whith
end;//Procedure
procedure TForm2.Button5Click(Sender:
TObject);
begin
if CurPattern<PatternCount
then
inc(CurPattern);
showCurrentPattern;
end;
procedure TForm2.Image1MouseDown(Sender:
TObject; Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
var
i,j:byte;
begin
j:=(X
div 20)+1;
i:=(Y div 20)+1;
if
Patterns[CurPattern][i,j]=1
then
Patterns[CurPattern][i,j]:=0
else
Patterns[CurPattern][i,j]:=1;
showCurrentPattern;
end;
procedure TForm2.Button2Click(Sender:
TObject);
begin
SavePatterns;
end;
procedure TForm2.Button1Click(Sender:
TObject);
begin
ReadPatterns;
end;
Procedure SavePatterns;
var
FP:file of TPattern;
i:byte;
begin
assignfile(FP,'Patterns.dat');
Rewrite(FP);
for i:=1 to PatternCount do
write(FP,Patterns[i]);
closefile(FP);
end;//Procedure
Procedure ReadPatterns;
var
FP:file of TPattern;
i:byte;
begin
assignfile(FP,'Patterns.dat');
Reset(FP);
PatternCount:=filesize(FP);
for i:=1 to PatternCount do
read(FP,Patterns[i]);
closefile(FP);
CurPattern:=1;
end;//Procedure
end.