Пытаюсь написать классы, реализующие нейронную сеть:
Код:
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;
возникает ошибка в выделенной строке. Подскажите, пожалуйста,
что я не так делаю?