Предыдущую ошибку преодолел убрав Abs.
Нейросеть
Add(InlineCode,12457072,497,448)
{
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|5:type |28: THiAsmClass = class(TDebug)|10: private|0:|9: public|0:|5: end;|1: |5:Type |27:TNeuron = Record // Нейрон.|35:X: Array of Real; // Входы нейрона.|58:W: Array of Real; // Массив весовых коэффициентов нейрона.|53:dw: Array of Real; // Массив изменений весов нейрона.|31:sigma: Real; // Ошибка нейрона.|29:OutN: Real; // Выход нейрона.|4:end;|0:|23:TSloy = Record // Слой.|49:Neuron: Array of TNeuron;// Массив нейронов слоя.|4:end;|0:|23:TSety = Record // Cеть.|38:Sloy: Array of TSloy; // Массив слоев.|4:end;|0:|48:TViborka = Record // Структура обучающей выборки|39:VhodV: Array of Real; // Входной вектор|41:VihodV: Array of Real; // Выходной вектор|4:end;|1: |4: Var|16://Form1: TForm1;|54:Sety: TSety; // Нейронная сеть, массив слоёв нейронов.|45:ParSety: Array of Integer; // Структура сети.|39:InV: Array of Real; // Вх. вектор сети.|41:OutV: Array of Real; // Вых. вектор сети.|66:SDraw: Array of Array of TData; // Для рисования сети (координаты)|59:Viborka: Array of TViborka; // Массив с обучающей выборкой.|64:ko: Real; // коэфициент крутизны сигмоида (обычно от 0.1 до 1.5)|54:e: Real; // скорость обучения. (обычно от 0.01 до 0.9)|86:Xo: Integer; // Дополнительный вход с +1 у каждого нейрона (если 0 то нет доп. входа).|57:im: Real; // Коэффициент импульса (обычно от 0.1 до 0.95)|0:|0:|14:implementation|0:|67:Procedure CreateSety(Const Par: Array of Integer); // Создает сеть.|3:Var|60:i, j, k: Integer; // i - слой. j - нейрон. k - веса нейрона.|5:begin|18:Randomize; // ГСЧ.|70:SetLength(Sety.Sloy, High(Par)+1); // Устанавливаем колличество слоев.|45:For i:= 0 To High(Par) Do // Перебераем слои.|5:begin|83:SetLength(Sety.Sloy[i].Neuron, Par[i]); // Устанавливаем колличество нейрон в слое.|70:For j:= 0 To High(Sety.Sloy[i].Neuron) Do // Перебераем нейроны в слое|30:begin // Если слой входной то.|73:if i = 0 Then SetLength(Sety.Sloy[i].Neuron[j].X, 1) // у нейрона 1 вход.|4:Else|107:begin // колличество входов и весов последующих слоев = колличеству нейрон предыдущего слоя + 1 вес и вход.|92:SetLength(Sety.Sloy[i].Neuron[j].X, (High(Sety.Sloy[i-1].Neuron)+1+1)); // +1 вход еденичный|103:SetLength(Sety.Sloy[i].Neuron[j].W, (High(Sety.Sloy[i-1].Neuron)+1+1)); // +1 вес для еденичного входа.|109:SetLength(Sety.Sloy[i].Neuron[j].dw, (High(Sety.Sloy[i-1].Neuron)+1+1)); // +1 изм. вес для еденичного входа.|74:For k:= 0 To High(Sety.Sloy[i].Neuron[j].W) Do // Перебераем веса нейрона.|5:begin|95:Sety.Sloy[i].Neuron[j].W[k]:= (Random(200)-100)/200; // веса нейронов заполняем СЧ.(-0,5..0,5).|97:Sety.Sloy[i].Neuron[j].dw[k]:= Sety.Sloy[i].Neuron[j].W[k]; // изменение веса вначале = СЧ. весу.|4:end;|99:Sety.Sloy[i].Neuron[j].X[High(Sety.Sloy[i].Neuron[j].X)]:= Xo; // подаем еденицу на еденичный вход.|4:end;|4:end;|4:end;|101:SetLength(OutV, High(Sety.Sloy[High(Sety.Sloy)].Neuron) + 1); // установка размера вых. вектора сети.|4:end;|0:|77:Function NeuronSigmoid(Const Xn, Wn: Array of Real): Real; // Модель нейрона.|3:Var|31:Sum: Real; // взвешенная сумма.|23:i: Integer; // счетчик.|5:begin|8:Sum:= 0;|78:For i:= 0 To High(Xn) Do Sum:= Sum + Xn[i]*Wn[i]; // подсчет взвешенной суммы.|0:|93://if Abs(Sum) < 40 Then // предел расчета. - Error: Incompatible types: 'Integer' and 'Real'|38:if Sum < 40 Then // предел расчета. @z|0:|47:Result:= 1/(1 + Exp(-Sum*ko)) // Ф-ла сигмоида.|4:Else|5:begin|52:if Sum >= 40 Then // результат при выходе за предел.|10:Result:= 1|4:Else|11:Result:= 0;|0:|4:end;|4:end;|0:|91:Procedure SetNeuroIn(Const InVektor: Array of Real); // Подача входных данных на нейросеть.|3:Var|26:j: Integer; // j - нейрон.|5:begin|78:For j:= 0 To High(Sety.Sloy[0].Neuron) Do // перебераем нейроны входного слоя.|73:Sety.Sloy[0].Neuron[j].X[0]:= InVektor[j]; // Присваеваем входной вектор.|4:end;|0:|71:Procedure GetNeuroOut(Var OutVektor: Array of Real); // Вых. нейросети.|3:Var|68:j, OutSloy: Integer; // j - нейрон. OutSloy - индекс выходного слоя.|5:begin|59:OutSloy:= High(Sety.Sloy); // узнаем индекс выходного слоя.|85:For j:= 0 To High(Sety.Sloy[OutSloy].Neuron) Do // перебераем нейроны выходного слоя.|81:OutVektor[j]:= Sety.Sloy[OutSloy].Neuron[j].OutN; // Присваеваем выходной вектор.|4:end;|0:|50:Procedure CalculateNeuro; // Вычисление всей сети.|3:Var|63:i, j, k, a: Integer; // i - слой. j - нейрон. k - веса нейрона.|5:begin|51:For i:= 0 To High(Sety.Sloy) Do // перебераем слои.|5:begin|71:For j:= 0 To High(Sety.Sloy[i].Neuron) Do // перебераем нейроны в слое.|0:|0:|39:if i = 0 Then // если слой входной то..|85:Sety.Sloy[i].Neuron[j].OutN:= Sety.Sloy[i].Neuron[j].X[0] // входной сигнал = выходу.|44:Else // если слой внутренний или последний..|115:Sety.Sloy[i].Neuron[j].OutN:= NeuronSigmoid(Sety.Sloy[i].Neuron[j].X, Sety.Sloy[i].Neuron[j].W); // считаем нейрон.|10: // a:= 1;|56:if i < High(Sety.Sloy) Then // если не последний слой то|5:begin|81:For j:= 0 To High(Sety.Sloy[i+1].Neuron) Do // перебераем нейроны следующего слоя|86:For k:= 0 To High(Sety.Sloy[i].Neuron) Do // перебераем входы нейрона следующего слоя.|101:Sety.Sloy[i+1].Neuron[j].X[k]:= Sety.Sloy[i].Neuron[k].OutN; // присваеваем вых. просчитаных нейронов|40:end; // входам нейронов следующего слоя.|0:|0:|4:end;|4:end;|0:|4:end.|
}