p align="left">Більшість сьогоднішніх нейрокомп'ютерів являють собою просто персональний комп'ютер або робочу станцію, до складу яких входить додаткова нейроплата. До їхнього числа відносяться, наприклад, комп'ютери серії FMR фірми Fujіtsu. Такі системи мають безперечне право на існування, оскільки їхніх можливостей цілком достатньо для розробки нових алгоритмів і вирішення великого числа прикладних задач методами нейроматематики. Однак найбільший інтерес представляють спеціалізовані нейрокомп'ютери, що безпосередньо реалізують принципи НМ. Типовими представниками таких систем є комп'ютери сімейства Mark фірми TRW (перша реалізація персептрона, розроблена Розенблатом, називалася Mark І). Модель Mark ІІІ фірми TRW являють собою робочу станцію, що містить до 15 процесорів сімейства Motorola 68000 з математичними співпроцесорами. Усі процесори об'єднані шиною VME. Архітектура системи, що підтримує до 65 000 віртуальних процесорних елементів з більш ніж 1 млн. з'єднань, що набудовуються, дозволяє обробляти до 450 тис. міжз'єднань / с. Mark ІV - це однопроцесорний суперкомп'ютер з конвеєрною архітектурою. Він підтримує до 236 тис. віртуальних процесорних елементів, що дозволяє обробляти до 5 млн. міжз'єднань / с. Комп'ютери сімейства Mark мають загальну програмну оболонку ANSE (Artіfіcіal Neural System Envіronment), що забезпечує програмну сумісність моделей. Крім зазначених моделей фірми TRW пропонує також пакет Mark ІІ - програмний эмулятор НМ. Іншою цікавою моделлю є нейронкомп'ютер NETSІ, створений фірмою Texas Іnstruments на базі розробок Кембріджського університету. Його топологія являє собою тривимірні ґрати стандартних обчислювальних вузлів на базі процесорів 80188. Комп'ютер NETSІ використовується для моделювання таких моделей НМ, як мережа Хопфилда - Кохонена і НМ зі зворотнім поширенням. Його продуктивність досягає 450 млн. міжз'єднань / с. Фірма Computer Recognіtііon Systems (CRS) продає серію нейрокомп'ютерів WІZARD/CRS 1000, призначених для обробки відеозображень. Розмір вхідного зображення 512 x 512 пікселей. Модель CRS 1000 вже знайшла застосування в промислових системах автоматичного контролю. Сьогодні на ринку представлено багато моделей нейрокомп'ютерів. Насправді їх, очевидно, набагато більше, але найбільш могутні і перспективні моделі як і раніше створюються за замовленнями військових. Нажаль, не маючи достатньої інформації про моделі спеціального призначення, важко скласти уявлення про істинні можливості сучасних комп'ютерів. {Програмна реалізація нейронної мережі Хебба} unit rou_main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, StdCtrls, Grids, Buttons; const yes='y'; //Стан активності/не активності no='n'; //комірки елемента TStringGrid str=10; //Розміри нейрону stol=10; type {Користувацькі типи даних} one_element= array [0..str*stol+4] of integer; //Опис нейрона W_type= array [0..3,0..str*stol] of integer; //Опис нейронної мережі S_type=array [0..3] of integer; //Масив сумарних //вихідних результатів TForm1 = class(TForm) {Опис елементів форми} Panel1: TPanel; s1: TStringGrid; //Поле першого нейрону l1: TLabel; Bevel1: TBevel; Memo1: TMemo; //Інформаційне поле Label2: TLabel; s2: TStringGrid; //Поле другого нейрону l2: TLabel; s3: TStringGrid; //Поле третього нейрону l3: TLabel; s4: TStringGrid; //Поле четвертого нейрону l4: TLabel; s5: TStringGrid; //Поле для символів, що розпізнаються Label6: TLabel; BitBtn1: TBitBtn; //Кнопка "Teaching" BitBtn2: TBitBtn; //Кнопка "Find" BitBtn3: TBitBtn; //Кнопка "Exit" BitBtn14: TBitBtn; //Кнопка "Clean" BitBtn8: TBitBtn; //Кнопка "Clean" BitBtn11: TBitBtn; //Кнопка "Clean" BitBtn15: TBitBtn; //Кнопка "Clean" BitBtn18: TBitBtn; //Кнопка "Clean" BitBtn4: TBitBtn; //Кнопка "Load" BitBtn5: TBitBtn; //Кнопка "Save" {Процедури і функції основної форми} procedure s1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure FormCreate(Sender: TObject); procedure s1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure BitBtn1Click(Sender: TObject); procedure Initialization_M; procedure Vivod_W (W:W_type); procedure BitBtn2Click(Sender: TObject); procedure BitBtn4Click(Sender: TObject); procedure BitBtn5Click(Sender: TObject); procedure BitBtn14Click(Sender: TObject); procedure BitBtn8Click(Sender: TObject); procedure BitBtn11Click(Sender: TObject); procedure BitBtn15Click(Sender: TObject); procedure BitBtn18Click(Sender: TObject); end; {Допоміжні процедури і функції} procedure Raschet_b1; function convert (s: string): integer; procedure Read_str_grd (str_grd:TStringGrid;var M:one_element); function Check_result (num_letter,num_nero:integer):boolean; procedure Obuchenie(num_letter,num_nero:byte); function Check_Learning :boolean; procedure checkFillM5(Y:integer); procedure clear_stringgrid (Sender:Tobject); function mask_el: W_type; procedure re_mask_el(mask_elem: W_type); {Основні змінні} var Form1 :TForm1; //Змінна форми M :array [0..4] of one_element; //Масив, що описує нейрони мережі W :W_type; //Опис нейронної мережі prizn :boolean; S :S_type; i :integer; f :file of W_type; //Змінна файлу для збереження //стану нейронної мережі implementation {$R *.dfm} {Процедура малювання форми} procedure TForm1.s1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin (sender as tstringgrid).canvas.Brush.Color:=$a08000; if (sender as tstringgrid).Cells[Acol,Arow]=yes then (sender as tstringgrid).canvas.FillRect(Rect) else begin (sender as tstringgrid).canvas.Brush.Color:=clCream; (sender as tstringgrid).canvas.FillRect(Rect) end; end; {Процедура створення форми} procedure TForm1.FormCreate(Sender: TObject); begin prizn:=false; clear_stringgrid (s1); //Очищення поля нейрону 1 clear_stringgrid (s2); //Очищення поля нейрону 2 clear_stringgrid (s3); //Очищення поля нейрону 3 clear_stringgrid (s4); //Очищення поля нейрону 4 clear_stringgrid (s5); //Очищення поля нейрону 5 end; {Процедура активації комірки нейрону} procedure TForm1.s1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (sender as tstringgrid).Cells[(sender as tstringgrid).Col,(sender as tstringgrid).Row]=yes then (sender as tstringgrid).Cells[(sender as tstringgrid).Col,(sender as tstringgrid).Row]:=no else (sender as tstringgrid).Cells[(sender as tstringgrid).Col,(sender as tstringgrid).Row]:=yes; end; {Процедура навчання нейронної мережі} procedure TForm1.BitBtn1Click(Sender: TObject); var i,j:integer; begin Memo1.Clear; //Очищення інформаційного поля Initialization_M; //Ініціалізація масиву W для навчання Memo1.Lines.Add('Initialization of the weight ratio of neuron connections'); Vivod_W (W); //Вивід масиву W Raschet_b1; //Розрахунок важелів зв'язків нейронів //для першого нейрону Memo1.Lines.Add('Calculation the firs simbol:'); Vivod_W (W); //Вивід масиву W {Навчання першого нейрону} Check_result (0,0); Check_result (0,1); Check_result (0,2); Check_result (0,3); {Навчання інших нейронів} for i:=1 to 3 do for j:= 0 to 3 do begin while not Check_result (i,j) do Obuchenie (i,j); //Навчання нейрону доки не отримано //жаданий результат end; Memo1.Lines.Add('Result weight ratio '); Vivod_W (W); //Вивід масиву W if Check_Learning then Memo1.Lines.Add('Teaching is successful.') else Memo1.Lines.Add('Teaching is impossible.'); BitBtn1.Enabled:=false; //Кнопка "Teaching" неактивна BitBtn2.enabled:=true; //Кнопка "Find" активна BitBtn5.enabled:=true; //Кнопка "Save" активна end; {Функція інтерпретації активності комірки нейрона} function convert (s: string): integer; begin if s=yes then Result:=1 else Result:=-1; end; {Функція початкової ініціалізації масиву W} procedure TForm1.Initialization_M; var str1 :string; j,i :byte; begin {Зчитуємо зображення навчальних символів} Read_str_grd (s1,M[0]); Read_str_grd (s2,M[1]); Read_str_grd (s3,M[2]); Read_str_grd (s4,M[3]); M[0,str*stol+1]:=1; M[1,str*stol+2]:=1; M[2,str*stol+3]:=1; M[3,str*stol+4]:=1; Memo1.Lines.Add('Giving of the set M:'); {Вивід на екран зчитаних даних} for j:= 0 to length (M)-2 do begin for i:= 0 to length(M[j])-1 do str1:=str1+' '+inttostr(m[j,i]); Memo1.Lines.Add(str1); str1:=''; end; end; {Конвертація зображення на нейроні в числові дані} procedure Read_str_grd (str_grd:TStringGrid;var M:one_element); var i,j:integer; begin for i:=0 to str-1 do for j:=0 to stol-1 do M[i*stol+j+1]:=convert(str_grd.Cells[j,i]); //Інтерпретація значення //комірок нейрона M[0]:=1; for i:= str*stol+1 to str*stol+4 do M[i]:=-1; end; {Процедура виводу на екран вмісту масиву W} procedure TForm1.Vivod_W (W:W_type); var i,j :byte; str :string; begin for j:=0 to length (W)-1 do begin Form1.Memo1.Lines.Add('W'+inttostr(j+1)+':'); for i:=0 to length (W[j])-1 do str:=str+ ' '+inttostr (W[j,i]); Form1.Memo1.Lines.Add(str); str:=''; end; end; {Процедура розрахунку важелів зв'язків нейронів для першого нейрону} procedure Raschet_b1; var i,j:byte; begin for j:=0 to length(W)-1 do begin for i:=0 to str*stol do W[j,i]:=W[j,i]+M[0,i]*M[0,str*stol+J+1]; end; end; {Функція визначення правильності навчання} function Check_result (num_letter,num_nero:integer):boolean; var i :integer; stroke :string; begin s[num_nero]:=0; for i:=0 to str*stol do begin s[num_nero]:=s[num_nero]+W[num_nero,i]*M[num_letter,i]; end; stroka:='Sending the char '+inttostr(num_letter+1)+' to the '+inttostr(num_nero+1)+' neuron'; Form1.Memo1.Lines.Add(stroka); Form1.Memo1.Lines.Add('S'+inttostr(num_nero+1)+'='+inttostr(s[num_nero])); if s[num_nero]<=0 then s[num_nero]:=-1 else s[num_nero]:=1; if s[num_nero]= M[num_letter,str*stol+num_nero+1] then Result:=true else begin Result:=false; Form1.Memo1.Lines.Add ('Incorrect result. Reteaching.'); end; end; {Процедура навчання нейрона} procedure Obuchenie(num_letter,num_nero:byte); var p: integer; begin for p:=0 to str*stol do W[num_nero,p]:=W[num_nero,p]+ M[num_letter,p]*M[num_letter,str*stol+num_nero+1]; end; {Функція визначення правильності навчання нейронної мережі} function Check_Learning :boolean; var res :array[0..3] of boolean; s :array[0..3] of integer; i,j,max,Y :integer; s1 :string; begin {Подання на вхід мережі навчальних символів і перевірка вірності реакції мережі на них} for y:=0 to 3 do begin res[Y]:=false; checkFillM5(Y); for j:=0 to 3 do begin s[j]:=0; for i:=0 to str*stol do begin s[j]:=s[j]+W[j,i]*M[4,i]; end; end; s1:='Identification of the Char '; max:=s[0]; for i:=1 to 3 do begin s1:='S= '+inttostr(s[i]); if s[i]>max then begin max:=s[i]; end; end; if max>0 then res[Y]:=true; end; result:=true; {Перевірка чи на всі навчальні зображення мережа реагує вірно} for i:=0 to 3 do if not res[i] then begin result:=false; break; end; end; {Процедура вибору символа} procedure checkFillM5(Y:integer); var i: integer; begin for i:=1 to str*stol do M[4,i]:=M[y,i] end; {Процедура визначення символу відповідно до навчальних зображень} procedure TForm1.BitBtn2Click(Sender: TObject); var s: array [0..3] of integer; i,j,k: byte; max: integer; strng: string; begin Memo1.Lines.Add('Identification of the Char '); l1.Color:=clSilver; l2.Color:=clSilver; l3.Color:=clSilver; l4.Color:=clSilver; Read_str_grd (s5,M[4]); //Зчитуємо зображення символу for j:=0 to 3 do begin s[j]:=0; for i:=0 to str*stol do begin s[j]:=s[j]+W[j,i]*M[4,i]; //Подання символу на нейрони і //визначення результуючих сум end; end; max:=s[0]; k:=0; for i:=0 to 3 do begin strng:=strng+'S'+inttostr(i+1)+'='+inttostr(s[i])+' '; if s[i]>max then begin max:=s[i]; //Визначення максимальної суми k:=i; //Визначення індексу вірного зображення end; end; Memo1.Lines.Add(strng); Memo1.Lines.Add('The char '+inttostr (K+1)+' has been identified.'); case (k+1) of //Позначення червоним кольором //символу, що визначений як вірний 1:l1.Color:=clRed; 2:l2.Color:=clRed; 3:l3.Color:=clRed; 4:l4.Color:=clRed; end; BitBtn1.Enabled:=true; //Кнопка "Teaching" активна end; {Функція отримання маски навчальних символів} function mask_el: W_type; var i,j :integer; mask_elem :W_type; begin for i:=0 to str-1 do for j:=0 to stol-1 do begin {Конвертація зображень навчальних символів у числові значення} mask_elem[0,i*stol+j]:=convert(Form1.s1.Cells[j,i]); mask_elem[1,i*stol+j]:=convert(Form1.s2.Cells[j,i]); mask_elem[2,i*stol+j]:=convert(Form1.s3.Cells[j,i]); mask_elem[3,i*stol+j]:=convert(Form1.s4.Cells[j,i]); end; Result:=mask_elem; end; {Процедура збереження в файлі "symbol.rou" стану нейронної мережі} procedure TForm1.BitBtn5Click(Sender: TObject); var W1 :W_type; begin w1:=mask_el; AssignFile(f, 'symbol.rou'); Rewrite(f); //Відкриття файлу для запису даних write(f,W); //Запис стану нейронної мережі write(f,W1); //Запис зображення навчальних символів CloseFile(f); Form1.Memo1.Lines.Add('Teaching Configuration data has been saved'+ ' in data file symbol.rou'); MessageDlg('Teaching Configuration data has been saved'+ ' in data file symbol.rou', mtInformation, [mbOk], 0); BitBtn4.enabled:=true; //Кнопка "Load" активна end; {Процедура активації нейронів мережі згідно із зображенням} procedure re_mask_el(mask_elem: W_type); var i,j :integer; begin {Очищення нейронів} clear_stringgrid(Form1.s1); clear_stringgrid(Form1.s2); clear_stringgrid(Form1.s3); clear_stringgrid(Form1.s4); for i:=0 to str-1 do for j:=0 to stol-1 do begin {Запис нового зображення в нейрони} if mask_elem[0,i*stol+j]=1 then Form1.s1.Cells[j,i]:=yes; if mask_elem[1,i*stol+j]=1 then Form1.s2.Cells[j,i]:=yes; if mask_elem[2,i*stol+j]=1 then Form1.s3.Cells[j,i]:=yes; if mask_elem[3,i*stol+j]=1 then Form1.s4.Cells[j,i]:=yes; end; end; {Процедура завантаження стану нейронної мережі із файлу "symbol.rou"} procedure TForm1.BitBtn4Click(Sender: TObject); var W1 :W_type; begin AssignFile(f, 'symbol.rou'); FileMode := 0; //Режим читання {$I-} Reset(f); //Відкриття файлу для читання {$I+} if IOResult = 0 then //Файл знайдено begin MessageDlg('Data from data file symbol.rou has been just loaded', mtInformation, [mbOk], 0); read(f,w); //Читання стану нейронної мережі read(f,W1); //Читання зображень навчальних символів re_mask_el(W1); //Активація нейронів, згідно із //зображенням навчальних символів CloseFile(f); end else //Файл не знайдено begin MessageDlg('File access error: Data File symbol.rou is epcent', mtWarning, [mbOk], 0); Memo1.Lines.Add('Data File symbol.rou is epcent'); end; Form1.BitBtn2.Enabled:=true; //Кнопка "Find" активна end; {Процедура очищення поля нейрона} procedure clear_stringgrid (Sender:Tobject); var i,j :byte; begin for i:=0 to (sender as TStringGrid).ColCount-1 do for j:=0 to (sender as TStringGrid).RowCount-1 do (sender as TStringGrid).Cells[i,j]:=no; end; {Очищення нейрону 1} procedure TForm1.BitBtn14Click(Sender: TObject); begin clear_stringgrid (s1); end; {Очищення нейрону 2} procedure TForm1.BitBtn8Click(Sender: TObject); begin clear_stringgrid (s2); end; {Очищення нейрону 3} procedure TForm1.BitBtn11Click(Sender: TObject); begin clear_stringgrid (s3); end; {Очищення нейрону 4} procedure TForm1.BitBtn15Click(Sender: TObject); begin clear_stringgrid (s4); end; {Очищення поля символу, що розпізнається} procedure TForm1.BitBtn18Click(Sender: TObject); begin clear_stringgrid (s5); end; end.
Страницы: 1, 2, 3, 4, 5, 6, 7
|