Исследование результатов работы программы-эмулятора ИНС

Автор: Пользователь скрыл имя, 17 Апреля 2013 в 18:30, курсовая работа

Описание работы

Искусственные нейронные сети (НС) – набор математических и алгоритмических методов для решения широкого круга задач. Они превосходят последовательные машины в решении тех же задач, в которых машину превосходит человек. К задачам, успешно решаемым НС на данном этапе их развития, относятся [1]:
Распознавание зрительных и слуховых образов: от распознавания текста до систем голосового управления.
Ассоциативный поиск информации и создание ассоциативных моделей: синтез речи, формирование естественного языка.
Формирование моделей различных нелинейных и трудно описываемых математически систем, а также прогнозирование развития этих систем во времени: прогнозирование развития различных природных процессов, изменений курсов валют, курсов акций и других финансовых показателей.

Содержание

Введение 7
Постановка задачи 9
1. Системный анализ методов распознавания образов и построения генераторов псевдослучайных величин. 10
1.1. Анализ методов распознавания графических образов 10
1.1.1 Статистические методы распознавания 10
1.1.2 Структурные (лингвистические) методы распознавания 12
1.1.3 Нейросетевые методы распознавания 15
1.1.4 Вывод по результатам анализа рассмотренных методов 18
1.2. Процедура искажения изображений 20
1.3.1 Преобразование Бокса – Мюллера. 20
1.3. Выводы 22
2. Реализация эмулятора нейронной сети Хемминга, решающей задачи распознавания зашумлённых образов. 23
2.1. Выбор структуры ИНС 25
2.2. Программная реализация ИНС 27
2.2.1. Интерфейс пользователя программы-эмулятора ИНС 31
2.3. Выводы 33
3. Исследование результатов работы программы-эмулятора ИНС 34
3.1 Выводы 36
Заключение 37
Библиографический список 38

Работа содержит 1 файл

нейросети.docx

— 397.07 Кб (Скачать)

public double GetDispersion()        

{            

double step = (Xmax() - Xmin()) / 100;            

double prevD = 0;            

double D = 1;            

double M = this.GetExpectation();            

while (Math.Abs(D - prevD) > 0.000001)            

{                

prevD = D;                

double current = 0;                

for (double x = Xmin(); x < Xmax(); x += step)                

{                    

current += step *                               

(Math.Pow((x + step - M), 2) * GetDensityFunctionValue(x + step) +                                

Math.Pow((x - M), 2) * GetDensityFunctionValue(x)) / 2;                

}                

D = current;                

step /= 2;            

}            

return D;        

}         

public double Xmin()        

{            

return Values[0].GetX;        

}         

public double Xmax()        

{            

return Values[Values.Count-1].GetX;        

}    

}

public class UniversalGenerator : IGenerator    

{        

private UniversalDistributionFunction Function = null;        

private IntervalFinder Finder = new IntervalFinder();//класс выполняющий разбиение интервала          

private Random BaseGenerator = new Random();//генератор базовой случайной величины         

private int Intervals;         

//конструктор заполняет внутренние поля         

public UniversalGenerator(int NumIntervals, List<Inflection> Values)         

{            

Function = UniversalDistributionFunction.Create(Values);//получаем экземпляр функции распределения             

Finder.Find(NumIntervals);//находим границы карманов             

Intervals = NumIntervals;        

}         

//сгенерировать очередное значение        

public double GenerateValue()        

{            

double x1 = BaseGenerator.NextDouble();// генерация очередного значения базовой случайной величины             

double result;            

//ищем номер интервала в который попало значение             

for (int i = 1; i < Finder.Borders.GetNumberOfPoints(); i++)            

{                

if (x1 <= ((double)i/Intervals))                

{                    

double x2 = BaseGenerator.NextDouble();//получаем ещё одно значение из генератора БСВ                     

//растяжение второго значения БСВ в пределах интервала                     

result = x2*(Finder.Borders.GetPoint(i) - Finder.Borders.GetPoint(i - 1)) + Finder.Borders.GetPoint(i - 1);                     

return result;                

}            

}            

throw new Exception("Значение БСВ за пределами допустимого интервала!\n");         

}         

public List<double> GetIntervals()        

{            

return Finder.GetIntervals();}}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение B.Эмулятор НС Хемминга.

 

 

 

 

unit Unit1;

 

interface

//uses ExtCtrls, Classes, Controls, StdCtrls;

uses

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

  Dialogs, StdCtrls;

 

type

InputNeiron=Record// Òèï — íåéðîí ïåðâîãî ñëîÿ

w: array[1..1681] of real; // Âåñîâûå êîýôôèöèåíòû âõîäîâ

Output: real; // Âûõîä

end;

 

Neiron=record // Òèï — íåéðîí âòîðîãî ñëîÿ

Output:real; // Âûõîä

Sum: real; // Âçâåøåííàÿ ñóììà âõîäîâ

end;

 

TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    Memo1: TMemo;

    Memo2: TMemo;

    Label1: TLabel;

    Button3: TButton;

    Button4: TButton;

    Memo3: TMemo;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    CheckBox1: TCheckBox;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure vScale(I1,I2: TImage);

    procedure Button3Click(Sender: TObject);

  

 

 

 

 

 

 

 

 

 procedure Button4Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

const SourceSize=100; // Ðàçìåð ñòîðîíû èñõîäíîãî èçîáðàæåíèÿ

DestSize=40; // Ðàçìåð ñòîðîíû èçîáðàæåíèÿ äëÿ ðàñïîçíàâàíèÿ

N=DestSize*DestSize; // Ñêîëüêî âõîäîâ

m=20; // Ñêîëüêî îáðàçîâ

e=-1/(M*2); // Âåñ ñèíàïñîâ âòîðîãî ñëîÿ

 

var

  Form1: TForm1;

  InputRow: array[1..m] of InputNeiron;//Ïåðâûé ñëîé íåéðîíîâ

SecondRow: array[1..m] of Neiron;//Âòîðîé ñëîé íåéðîíîâ

I1,I2:timage;//Ýòàëîííûé è ìàñøòàáèðîâàííûé îáðàçû

Outputs:array[1..m] of real; // Êîïèÿ âûõîäîâ ïðåäûäóùåãî ïðîõîäà

i,j,x,y,count,max, index:integer;

 

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

label1.Caption := 'îáó÷åíèå';

 

memo1.Clear;

I1:=TImage.Create(self);

I2:=TImage.Create(self);

I2.Width:=DestSize;

I2.Height:=DestSize;

for i:=1 to m do

begin

I1.Picture.LoadFromFile('ideal\'+IntToStr(i-1)+'.bmp');

vScale(I1,I2); // ×èòàåì è ìàñøòàáèðóåì îáðàç

x:=1;

y:=1;

for x:=1 to DestSize do

begin

for y:=1 to DestSize do // Ïåðåáèðàåì ïîòî÷å÷íî

begin

if (I2.Canvas.Pixels[x-1,y-1]=clBlack)

then InputRow[i].W[x*DestSize+y]:=0.5

else InputRow[i].W[x*DestSize+y]:=-0.5;

end;

end;

end;

label1.Caption := 'Ñåòü ãîòîâà';

end;

 

procedure TForm1.vScale(I1,I2:TImage);

var k1,k2,MinX,MinY,MaxX,MaxY:integer; // Ãðàíèöû ëîêàëèçîâàííîé öèôðû

ScaleX, ScaleY: real;//// Êîýôôèöèåíòû ñæàòèÿ

begin

MinX:= SourceSize+1;

MinY:= MinX;

MaxX:= -1;

MaxY:= -1;

for x:=0 to SourceSize-1 do//ìàññèâ Pixels íóìåðóåòñÿ ñ 0

for y:=0 to SourceSize-1 do

if I1.Canvas.Pixels[x,y]=clBlack then begin

if x<MinX then MinX:=x;

if y<MinY then MinY:=y;

if x>MaxX then MaxX:=x;

if y>MaxY then MaxY:=y end;

 

ScaleX:=(MaxX-MinX)/DestSize;

ScaleY:=(MaxY-MinY)/DestSize;

for x:=0 to DestSize-1 do

for y:=0 to DestSize-1 do

begin

k1 := Round(x*ScaleX+MinX);

k2 := Round(y*ScaleY+MinY);

I2.Canvas.Pixels[x,y] := I1.Canvas.Pixels[k1,k2];

end;

end;

 

 

 

procedure TForm1.Button2Click(Sender: TObject);

var

flag:bool;

q:integer;

BitMap1:TBitMap;

BitMap2:TBitMap;

begin

I1.Picture.LoadFromFile('test\'+ memo2.text +'.bmp');

vScale(I1,I2);

BitMap1:=TBitMap.Create;

// Çàãðóçêà â BitMap âûáðàííîãî ãðàôè÷åñêîãî ôàéëà (òóò òîêà áìï ìîæíî)

BitMap1.LoadFromFile('test\' + memo2.text + '.bmp');

// Ïåðåíîñ èçîáðàæåíèÿ íà êàíâó ôîðìû

Canvas.Draw(360, 250, BitMap1);

for i:=1 to m do

begin

 

InputRow[i].Output:=0;

for x:=1 to DestSize do

for y:=1 to DestSize do // Ïîäà¸ì îáðàç íà íåéðîíû ïåðâîãî ñëîÿ

if i2.Canvas.Pixels[x-1,y-1]=clBlack then

InputRow[i].Output:= InputRow[i].Output+InputRow[i].W[x*DestSize+y]

else InputRow[i].Output:= InputRow[i].Output-InputRow[i].W[x*DestSize+y];

if InputRow[i]. Output>=N/2 then

InputRow[i].Output:=N/2; // Âûõîä - ÷åðåç ôóíêöèþ ëèíåéíîãî ïîðîãà

end;

for i:=1 to m do

begin

SecondRow[i].Output:= InputRow[i].Output;

Outputs[i]:=InputRow[i].Output;

SecondRow[i].Sum:=0;

end;

Count:=0;

repeat

for i:=1 to m do // Çíà÷åíèÿ ïðåäûäóùåé èòåðàöèè

begin

Outputs[i]:=SecondRow[i].Output;

SecondRow[i].Sum := 0;

end;

for i:=1 to m do // Îäèí øàã ðàáîòû âòîðîãî ñëîÿ

for j:=1 to m do

if i=j then // c åãî âûõîäîâ íà åãî æå âõîäû

SecondRow[j].Sum := SecondRow[j].Sum+ SecondRow[i].Output

else

SecondRow[j].Sum := SecondRow[j].Sum+ SecondRow[i].Output * e;

Flag:=true;

for i:=1 to m do

begin

SecondRow[i].Output := SecondRow[i].Sum;

If Outputs[i] <> SecondRow[i].Output then flag:=false;

end;

Count:=Count+1;

until (flag or (Count>25));

Max:= -N;

For i:=1 to m do

If SecondRow[i].Output>Max then

begin

Max := Round(SecondRow[i].Output);

Index := i;

end;

if Index > 10 then

Memo1.Text:=(Inttostr(index-11)) else Memo1.Text:=(Inttostr(index-1));

BitMap2:=TBitMap.Create;

// Çàãðóçêà â BitMap âûáðàííîãî ãðàôè÷åñêîãî ôàéëà (òóò òîêà áìï ìîæíî)

BitMap2.LoadFromFile('ideal\'+ memo1.Text + '.bmp');

// Ïåðåíîñ èçîáðàæåíèÿ íà êàíâó ôîðìû

Canvas.Draw(510, 250, BitMap2);

end;

 

 

procedure TForm1.Button3Click(Sender: TObject);

begin

form1.Close;

end;

 

procedure TForm1.Button4Click(Sender: TObject);

var

I3:TImage;

k,l,t,o,a:integer;

g,h,s,p:real;

v: array[0..10000] of integer;

begin

Randomize;

a:= strtoint(memo3.text);

I3:=TImage.Create(self);

I3.Picture.LoadFromFile('ideal\'+ memo2.Text+'.bmp');

if(checkbox1.Checked = false) then

begin

for k:=0 to SourceSize-1 do

for l:=0 to SourceSize-1 do

if (a<>0) then

if ((random(101))<= a) then

begin

if I3.Canvas.Pixels[k,l]=clBlack then

I3.Canvas.Pixels[k,l]:=clWhite else

I3.Canvas.Pixels[k,l]:=clBlack;

end;

end else

//for o:=0 to round((SourceSize*a)) do

repeat

begin

g:= (random(10000)/5000)-1;

h:= (random(10000)/5000)-1;

for t:=0 to 100 do

begin

g:= (random(10000)/5000)-1;

h:= (random(10000)/5000)-1;

if((g*g + h*h)>0) then

if ((g*g + h*h)<=1) then

break;

end;

s:=(g*g + h*h);

p:=g*sqrt((-2*ln(s))/s);

p:=round((((p/3)+1)*SourceSize*SourceSize)/2)+3000;

if(p<0) then

p:=p+10000;

if(p>10000) then

p:=10000;

label6.Caption := floattostr(p);

k:=trunc(p/100);

label6.Caption := inttostr(k);

l:=round(p-k*100);

label7.Caption := inttostr(l);

if v[round(p)]=0 then

if I3.Canvas.Pixels[k,l]=clBlack then

I3.Canvas.Pixels[k,l]:=clWhite else

I3.Canvas.Pixels[k,l]:=clBlack else o:=o-1;

v[round(p)]:=1;

o:=o+1;

//s:=p/SourceSize;

//k:= (p/SourceSize);

end;

until o>round((SourceSize*a));

for o:=0 to sqr(SourceSize-1) do

v[o]:=0;

I3.Picture.SaveToFile('test\'+memo2.Text+'.bmp');

end;

end.

 


Информация о работе Исследование результатов работы программы-эмулятора ИНС