Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2011, 09:24
dank dank вне форума
Прохожий
 
Регистрация: 16.03.2011
Сообщения: 2
Репутация: 10
Вопрос Создание класса

Пытаюсь написать классы, реализующие нейронную сеть:

Код:
unit NeuroNetUnit;
interface
uses
  SysUtils, Classes, Math;

type
  TNeuron = class
  private
  NInp: Integer; // количество входов
  W: array of Double; // веса нейрона
  O: Double; // выход нейрона

  protected
  Procedure SetWeight(Index: Integer; NW: Double);
  function GetWeight(Index: Integer): Double;
  Procedure SetRandWeight; // задание случайных весов
  Procedure Computation(Inputs: array of Double); // вычисление выхода нейрона

  public
  Constructor Create(NI: Integer);
  property Weight[Index: Integer]: Double read GetWeight write SetWeight;
  property Output: Double read O;
end;

  TLayer = class  // Слой
  private
  NNeuron: Integer; // число нейронов в слое
  NInp: Integer; // количество входов
  Neurons: array of TNeuron; // Массив нейронов слоя
  O: array of Double; //массив выходов слоя

  protected
  function GetOutput(Index: Integer): Double;
  Procedure Computation(Inputs: array of Double); // вычисление выходов слоя

  public
  Constructor Create(NI, NN: Integer);  //virtual;
  Procedure initializ;
  property Outputs[Index: Integer]: Double read GetOutput {write SetOutput};
end;

  TNeuroNetBP = class
  private
  NInp: Integer; // количество входов
  NLayer: Integer; // число слоев
  NNeuron: Integer; // число нейронов в слое
  NOutNeuron: Integer; // число нейронов в последнем слое (количество выходов)
  Layers: array of TLayer; // слои нейронов
  N: Double; //коэффициент скорости обучения
  NS: Integer; // число проходов при обучении

  protected
  Procedure SetSKoef(SK: Double);
  Procedure SetNStep(NNS: Integer);
  Procedure Step(Inputs: array of Double); // Проход вперед
  Procedure UpdateWeight(Output: array of Double); // корректировка весов (обратный проход)
  //Procedure Training(Inputs: array of Double; Output: array of Double); //обучение сети

  public
  Constructor Create(NI: Integer; NL: Integer; NN: Integer; NON: Integer);
  Procedure initializ;
  property SKoef: Double read N write SetSKoef;
  property NStep: Integer read NS write SetNStep;
end;

implementation

//////////////////////////////////////////////////////////нейрон
Constructor TNeuron.Create(NI: Integer);
begin
  NInp:= NI;
  SetLength(W, NInp);
end;

Procedure TNeuron.SetWeight(Index: Integer; NW: Double);
begin
end;

function TNeuron.GetWeight(Index: Integer): Double;
begin
end;

Procedure TNeuron.SetRandWeight;
begin
end;

Procedure TNeuron.Computation(Inputs: array of Double);
begin
end;
//////////////////////////////////////////////////////////нейрон

//////////////////////////////////////////////////////////слой
Constructor TLayer.Create(NI: Integer; NN: Integer);
begin
    NInp:= NI;
  NNeuron:= NN;
  SetLength(Neurons, NNeuron);
  SetLength(O, NNeuron);
end;

Procedure TLayer.initializ;
var
  i: Integer;
begin
  for i:=0 to (NNeuron-1) do
  begin
    Neurons[i].Create(NInp);
    Neurons[i].SetRandWeight;
  end;
end;  

Procedure TLayer.Computation(Inputs: array of Double);
 begin
end;

function TLayer.GetOutput(Index: Integer): Double;
begin
  Result:= O[Index];
end;    
//////////////////////////////////////////////////////////слой

//////////////////////////////////////////////////////////сеть
Constructor TNeuroNetBP.Create(NI: Integer; NL: Integer;
NN: Integer; NON: Integer);
begin
  NInp:= NI;
  NLayer:= NL;
  NNeuron:= NN;
  NOutNeuron:= NON;
  N:= 0.2;
  SetLength(Layers, NLayer);
end;


Procedure TNeuroNetBP.initializ;
var
  i: Integer;
begin  
  Layers[0].Create(NInp, NNeuron);
  for i:=1 to NLayer-1 do Layers[i].Create(NNeuron, NNeuron);
  Layers[NLayer].Create(NLayer, NOutNeuron);
end;

Procedure TNeuroNetBP.SetSKoef(SK: Double);
begin
  N:= SK;
end;  

Procedure TNeuroNetBP.SetNStep(NNS: Integer);
begin
  NS:= NNS;
end;  

Procedure TNeuroNetBP.Step(Inputs: array of Double);
begin
end;

Procedure TNeuroNetBP.UpdateWeight(Output: array of Double);
begin
end;

//////////////////////////////////////////////////////////сеть

end.

при попытке создания:
Код:
var
  NNet: TNeuroNetBP;
begin
  NNet.Create(2, 3, 5, 1);
  NNet.SKoef:= 0.2;
  NNet.NStep:= 5;
  NNet.initializ;
end;
возникает ошибка в выделенной строке. Подскажите, пожалуйста,
что я не так делаю?
Ответить с цитированием
  #2  
Старый 17.03.2011, 09:32
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Все не смотрел, заметил это:
Код:
var
  NNet: TNeuroNetBP;
begin
  NNet := TNeuroNetBP.Create(2, 3, 5, 1);
  NNet.SKoef:= 0.2;
  NNet.NStep:= 5;
  NNet.initializ;
end;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 17.03.2011, 09:47
dank dank вне форума
Прохожий
 
Регистрация: 16.03.2011
Сообщения: 2
Репутация: 10
По умолчанию

dr. F.I.N.
Спасибо! теперь работает
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter