Искусственные нейронные сети. Каширина И.Л. - 45 стр.

UptoLike

Составители: 

45
Масштабирование позволяет существенно снизить время обучения персеп -
трона и приблизить точность распознавания к 100%.
После нажатия кнопки проверить” происходит формирование бинарного
входного образа (1- ячейка сетки закрашена , 0-нет). В данном случае удобнее рас-
сматривать входной образ как матрицу размером 20×20. При запуске программы
идентичного размера весовая матрица инициализируется случайными числами,
равномерно распределенными в промежутке [-0.3,0.3]. Так как вход и весовые ко-
эффициенты известны , вычисляется выход персептрона . Если получено выходное
значение 1, считается, что персептрон распознал крестик, в противном случае
нолик. Результат распознавания персептрона сообщается пользователю в отдель-
ном диалоговом окне (см . рис 25). Если результат неверный (пользователь нажал
нет”), происходит обучение (коррекция весов ) персептрона . Скорректированные
веса заносятся в файл, поэтому при следующем обращении к программе можно не
обучать персептрон заново, а использовать сохраненную матрицу весов .
Текст программы с пояснениями приведен далее.
Описание типов , констант и переменных:
type
TMainForm = class(TForm)
DGImg: TDrawGrid;//сетка для рисования изображений крестиков и ноликов
BtnClear: TButton;// кнопка “очистить”
BtnScale: TButton; // кнопка “выровнять”
BtnInitRandom: TButton;//кнопка “случ.веса”
BtnCheck: TButton;//кнопка “проверить”
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
BtnLoadWeights: TButton; //кнопка “загрузить веса”
BtnSaveWeights: TButton; //кнопка “сохранить веса”
SBStatus: TStatusBar;
procedure DGImgDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DGImgSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure BtnClearClick(Sender: TObject);
procedure BtnScaleClick(Sender: TObject);
procedure BtnInitRandomClick(Sender: TObject);
procedure BtnCheckClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
function SaveWeights(filename:string):boolean;
function LoadWeights(filename:string):boolean;
procedure BtnLoadWeightsClick(Sender: TObject);
procedure BtnSaveWeightsClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
bmatrix=array[0..n-1,0..n-1] of byte;
rmatrix=array[0..n-1,0..n-1] of real;
const n=20; // размер сетки рисунка
var
MainForm: TMainForm;
imgmatrix:bmatrix;// входная ìàòðèöà, õðàíÿùàÿ "ðèñóíîê"
weights:rmatrix; // ìàòðèöà âåñîâ äëÿ îäíîãî íåéðîíà. äâóìåðíà ðàäè óäîáñòâà
speed:real=0.7; // коэфф. скорости обучения
                                        45
      Масштабирование позволяет существенно снизить время обучения персеп-
трона и приблизить точность распознавания к 100%.
      После нажатия кнопки “проверить” происходит формирование бинарного
входного образа (1- ячейка сетки закрашена, 0-нет). В данном случае удобнее рас-
сматривать входной образ как матрицу размером 20×20. При запуске программы
идентичного размера весовая матрица инициализируется случайными числами,
равномерно распределенными в промежутке [-0.3,0.3]. Так как вход и весовые ко-
эффициенты известны, вычисляется выход персептрона. Если получено выходное
значение 1, считается, что персептрон распознал крестик, в противном случае –
нолик. Результат распознавания персептрона сообщается пользователю в отдель-
ном диалоговом окне (см. рис 25). Если результат неверный (пользователь нажал
“нет”), происходит обучение (коррекция весов) персептрона. Скорректированные
веса заносятся в файл, поэтому при следующем обращении к программе можно не
обучать персептрон заново, а использовать сохраненную матрицу весов.
      Текст программы с пояснениями приведен далее.
Описание типов, констант и переменных:
type
  TMainForm = class(TForm)
     DGImg: TDrawGrid;//сетка для рисования изображений крестиков и ноликов
     BtnClear: TButton;// кнопка “очистить”
     BtnScale: TButton; // кнопка “выровнять”
     BtnInitRandom: TButton;//кнопка “случ.веса”
     BtnCheck: TButton;//кнопка “проверить”
     OpenDialog: TOpenDialog;
     SaveDialog: TSaveDialog;
     BtnLoadWeights: TButton; //кнопка “загрузить веса”
     BtnSaveWeights: TButton; //кнопка “сохранить веса”
     SBStatus: TStatusBar;
     procedure DGImgDrawCell(Sender: TObject; ACol, ARow: Integer;
       Rect: TRect; State: TGridDrawState);
     procedure DGImgSelectCell(Sender: TObject; ACol, ARow: Integer;
       var CanSelect: Boolean);
     procedure BtnClearClick(Sender: TObject);
     procedure BtnScaleClick(Sender: TObject);
     procedure BtnInitRandomClick(Sender: TObject);
     procedure BtnCheckClick(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     function SaveWeights(filename:string):boolean;
     function LoadWeights(filename:string):boolean;
     procedure BtnLoadWeightsClick(Sender: TObject);
     procedure BtnSaveWeightsClick(Sender: TObject);
  private
     { Private declarations }
  public
     { Public declarations }
  end;
  bmatrix=array[0..n-1,0..n-1] of byte;
  rmatrix=array[0..n-1,0..n-1] of real;
const n=20; // размер сетки рисунка
var
  MainForm: TMainForm;
  imgmatrix:bmatrix;// входная ìàòðèöà, õðàíÿùàÿ "ðèñóíîê"
  weights:rmatrix; // ìàòðèöà âåñîâ äëÿ îäíîãî íåéðîíà. äâóìåðíà ðàäè óäîáñòâà
  speed:real=0.7; // коэфф. скорости обучения