Наиболее вероятной причиной вашей ошибки является переполнение аккумуляторов neuronsHidden
или weightsHidden
.Я ничего не знаю о нейронных сетях, поэтому не могу дать никакого объяснения, почему это так.
В качестве дополнительной проблемы я ставлю под сомнение использование Extended
переменных с плавающей запятой.Обычно это просто приводит к крайне низкой производительности, намного медленнее, чем при использовании Double
.Вы можете подумать, что это дает вам больше возможностей для больших чисел, но на самом деле, если это чрезмерное переполнение той природы, которую я подозреваю, то использование Extended
никогда не спасет вас.
UPDATE OP указывает, что переполнение приводит к другому классу исключений.Так что для EInvalidOp
я подозреваю какой-то сбой квадратного корня или триггера или что-то в этом роде.Или, возможно, сигнальный NaN, но, поскольку вы, очевидно, не используете неинициализированные данные, я этого не продолжу.
Теперь я вижу, что вы были затронуты странным решением Embarcadero прервать реализацию Tanh
,Раньше он отлично работал на старых версиях Delphi (например, D6), но недавно был сломан.Используемая версия не совсем подходит для большого отрицательного ввода и использует два вызова Exp
, когда достаточно одного.Я использую эту версию:
const
MaxTanhDomain = 5678.22249441322; // Ln(MaxExtended)/2
function Tanh(const X: Extended): Extended;
begin
if X>MaxTanhDomain then begin
Result := 1.0
end else if X<-MaxTanhDomain then begin
Result := -1.0
end else begin
Result := Exp(X);
Result := Result*Result;
Result := (Result-1.0)/(Result+1.0);
end;
end;