Автор: Пользователь скрыл имя, 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
public double GetDispersion()
{
double step = (Xmax() - Xmin()
double prevD = 0;
double D = 1;
double M = this.
while (Math.Abs(D - prevD) >
{
prevD = D;
double current = 0;
for (double x = Xmin(); x <
{
current += step *
(Math.Pow((x + step - M), 2) *
Math.Pow((x - M), 2) *
}
D = current;
step /= 2;
}
return D;
}
public double Xmin()
{
return Values[0].GetX;
}
public double Xmax()
{
return Values[Values.Count-1].
}
}
public class
{
private
private IntervalFinder Finder
private Random BaseGenerator =
private int Intervals;
//конструктор заполняет
public UniversalGenerator(int
{
Function =
Finder.Find(NumIntervals);//
Intervals = NumIntervals;
}
//сгенерировать очередное
public double GenerateValue()
{
double x1 = BaseGenerator.
double result;
//ищем номер интервала в
for (int i = 1; i < Finder.
{
if (x1 <= ((double)i/
{
double x2 = BaseGenerator.
//растяжение второго значения
result = x2*(Finder.Borders.
return result;
}
}
throw new Exception("Значение
}
public List<double>
{
return Finder.GetIntervals();}
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('
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]=
then InputRow[i].W[x*DestSize+y]:=
else InputRow[i].W[x*DestSize+y]:=-
end;
end;
end;
label1.Caption := 'Ñåòü ãîòîâà';
end;
procedure TForm1.vScale(I1,I2:TImage);
var k1,k2,MinX,MinY,MaxX,MaxY:
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\
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]=
InputRow[i].Output:= InputRow[i].Output+InputRow[i]
else InputRow[i].Output:= InputRow[i].Output-InputRow[i]
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].
SecondRow[i].Sum:=0;
end;
Count:=0;
repeat
for i:=1 to m do // Çíà÷åíèÿ ïðåäûäóùåé èòåðàöèè
begin
Outputs[i]:=SecondRow[i].
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-
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('
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]:=
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)*
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\'+
end;
end.
Информация о работе Исследование результатов работы программы-эмулятора ИНС