Сети... Delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем Cyber_Mozg, 8 окт 2024.

  1. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Добрый день уважаемые форумчане...
    Разбираюсь с нейронными сетями, нашел сгенерированный код не могу понять что он делает , если есть у кого пара минут помогите .. объясните
    задача написать нейронную сеть для игры например в кости представленный фрагмент выбрасывает всегда или 6 или 1)
    Код (Delphi):
    1. type
    2.   TForm1 = class(TForm)
    3.      Button1: TButton;
    4.     Button2: TButton;
    5.     procedure Button1Click(Sender: TObject);
    6.   end;
    7.  
    8.     TNeuralNetwork = class
    9.     FWeights: array[0..1] of Double;
    10.     FLearningRate: Double;
    11.     function Sigmoid(x: Double): Double;
    12.     function SigmoidDerivative(x: Double): Double;
    13.     constructor Create(LearningRate: Double);
    14.     function Predict(Input: array of Double): Double;    // Предсказание результата
    15.     procedure Train(Input: array of Double; Target: Double);  // Обучение
    16.     function RollDice: Integer;
    17.      // Эмуляция броска кубика
    18.   end;
    19.  
    20.  
    21. var
    22.   Form1: TForm1;
    23.  
    24. implementation
    25.  
    26. {$R *.dfm}
    27.  
    28. constructor TNeuralNetwork.Create(LearningRate: Double);
    29. begin
    30.   Randomize;
    31.   FWeights[0] := Random; // Инициализация веса
    32.   FWeights[1] := Random; // Инициализация веса
    33.   FLearningRate := LearningRate;
    34. end;
    35.  
    36. function TNeuralNetwork.Sigmoid(x: Double): Double;
    37. begin
    38.   Result := 1 / (1 + Exp(-x));
    39. end;
    40.  
    41. function TNeuralNetwork.SigmoidDerivative(x: Double): Double;
    42. begin
    43.   Result := x * (1 - x);
    44. end;
    45.  
    46. function TNeuralNetwork.Predict(Input: array of Double): Double;
    47. var
    48.   Sum: Double;
    49. begin
    50.   Sum := FWeights[0] * Input[0] + FWeights[1] * Input[1];
    51.   Result := Round(Sigmoid(Sum) * 6); // Умножаем на 6 для предсказания от 1 до 6
    52.   if Result < 1 then Result := 1; // Ограничиваем минимум
    53.   if Result > 6 then Result := 6; // Ограничиваем максимум
    54. end;
    55.  
    56. procedure TNeuralNetwork.Train(Input: array of Double; Target: Double);
    57. var
    58.   Output, Error, Delta: Double;
    59. begin
    60.   Output := Predict(Input);  // Получаем предсказание
    61.   Error := Target - Output;  // Вычисляем ошибку
    62.  
    63.   // Корректируем веса
    64.   for var i := 0 to High(Input) do
    65.   begin
    66.     Delta := Error * SigmoidDerivative(Output);
    67.     FWeights[i] := FWeights[i] + FLearningRate * Delta * Input[i];
    68.   end;
    69. end;
    70.  
    71. function TNeuralNetwork.RollDice: Integer;
    72. begin
    73.   Result := Random(6) + 1; // Возвращаем случайное число от 1 до 6
    74. end;
    75.  
    76.  
    77. procedure TForm1.Button1Click(Sender: TObject);
    78.  
    79. var
    80.   NN: TNeuralNetwork;
    81.   Input: array of Double;
    82.   Target: Integer;
    83.   Prediction, Prediction1: Integer;
    84.   Roll: Integer;
    85.  
    86. begin
    87.   // Создаем нейронную сеть
    88.   NN := TNeuralNetwork.Create(0.1); // скорость обучения 0.1
    89.  
    90.   // Обучаем сеть на 10 произвольных бросках
    91.   for var i := 1 to 10000 do
    92.   begin
    93.     Roll := NN.RollDice; // Эмулируем бросок
    94.     Input := [i, Roll]; // Пример входа: номер броска и результат
    95.     NN.Train(Input, Roll); // Обучение на результате броска
    96.   end;
    97.  
    98.   // Прогнозирование
    99.   Input := [11, 0.0]; // Пример входа: номер броска и результат 0.0
    100.   Prediction :=trunc(NN.Predict(Input)); // Предсказываем результат
    101.   Prediction1:=round(Prediction);
    102.  
    103.  
    104.    Button2.Caption:='Predicted dice roll: ' + IntToStr(Prediction1);
    105.   {ReadLn;} // Ожидаем нажатия клавиши
    106. end;
     
  2. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    Код (Delphi):
    1. unit Neural;
    2.  
    3. type
    4.   NeuralSystem = record
    5.  
    6.     countInputNeural: integer;
    7.  
    8.     x: array of real;
    9.     w: array of real;
    10.     y: real;
    11.  
    12.     err: real;
    13.      
    14.     procedure Init(countInputNeural: integer);
    15.     begin
    16.       Randomize;
    17.    
    18.       self.countInputNeural := countInputNeural;
    19.       x := new real[countInputNeural];
    20.       w := new real[countInputNeural];
    21.       for var i := 0 to countInputNeural - 1 do
    22.         w[i] := random(-1, 1);
    23.     end;
    24.  
    25.     function Learn(xInput: array of real; yInput: real): real;
    26.     begin
    27.       var yCopy: real;
    28.       self.err := 0;
    29.       yCopy := 0;
    30.       for var i := 0 to countInputNeural - 1 do
    31.         yCopy += xInput[i] * w[i];
    32.       yCopy := 1 / (1 + exp(-yCopy));
    33.       self.err := yInput - yCopy;
    34.       for var i := 0 to countInputNeural - 1 do
    35.         w[i] += (err * 0.5 * xInput[i]);
    36.       result := err;
    37.     end;
    38.  
    39.     function Activate(xInput: array of real): real;
    40.     begin
    41.       self.y := 0;
    42.       self.x := xInput;
    43.       for var i := 0 to countInputNeural - 1 do
    44.         self.y += self.x[i] * self.w[i];
    45.       self.y := 1 / (1 + exp(-self.y));
    46.       result := y;
    47.     end;
    48.  
    49.   end;
    50.  
    51. begin
    52.  
    53. end.
     
  3. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Ребзя вопрос
    Код (Delphi):
    1. type
    2.  TLayer = array of Double;
    3. var
    4. InputData: array of TLayer;
    5. SetLength(InputData, 1000);
    6. InputData[I] := [Random(6) + 1, Random(6) + 1];
    7. InputData[I][0] + InputData[I][1]
    Инпутдата динамический массив
    к примеру for I :=0 to 1200
    InputData[0] и InputData[1] он двухмерный ?
    я не пойму вроде он одномерный но [0] и InputData[1] это что ?

    --- Сообщение объединено, 13 окт 2024 ---
    одномерный вещественный числа в нем представлены [Random(6) + 1, Random(6) + 1]
    как тогда обработать данные к примеру вывести floatti string / ToString(InputData[nm1] вызывают ругань у компилятора
     
  4. schuler

    schuler New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2021
    Сообщения:
    7
    Двумерный динамический массив вещественных чисел. Для старых версий Delphi код выглядел бы примерно вот так:
    Код (Delphi):
    1. var
    2. InputData: array of array of Double;
    3. begin
    4.   SetLength(InputData,1200,2);
    5.   for i:=Low(InputData) to High(InputData) do
    6.   begin
    7.   InputData[i][0]:=Random(6)+1;
    8.   InputData[i][1]:=Random(6)+1;
    9.   end;
    А тут код для версии XE7+ (появились новые возможности для работы с динамическимим массивами) . По этому обрывку ничего непонятно.
     
  5. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Проблема началась с того что захотел в консоле просмотреть какие данные формируются в массивах
     

    Вложения:

    • NMMMMMMMMMM.7z
      Размер файла:
      1,7 КБ
      Просмотров:
      116
  6. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    FWeightsInputHidden: array of array of Double;
    FWeightsHiddenOutput: array of array of Double;

    можно оформить проще как

    FWeightsInputHidden: array of TLayer;
    FWeightsHiddenOutput: array of TLayer;

    ?
     
  7. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Так я понял директива создания двух мерного массива array of array, почему же array of TLayer; создаёт тоже двух мерный?
    --- Сообщение объединено, 13 окт 2024 ---
    И объясните плз что возвращает метод nn. Forward
     
  8. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Ив догонку вопрос, ребят стоит питон начинать учить?
     
  9. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    92
    Стоит, но сначала ассемблер
     
  10. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Ребят у кого время есть помогите понять почему Range check erro
     

    Вложения:

  11. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    92
    1) Для этого есть отладчик. Просто переключитесь на Debug версию
    2) У вас в EnergyNN.pas
    Код (Pascal):
    1.  
    2. function TNeuralNetwork.Train(Input: DynAR2; Expected: array of Double; EPOCHS:Integer): Double;
    3. var
    4.   HiddenOutputs: array of Double; // Объявлен динамический массив (размерность не определена; нужен SetLength)
    5.   i, j : Integer;
    6.   TotalError: Double;
    7. begin
    8.   TotalError := 0;
    9.   for j := 0 to EPOCHS - 1 do
    10.   begin
    11.     TotalError := 0;
    12.     for i := 0 to High(Input) do
    13.     begin
    14.       // Прямой проход
    15.       for var k := 0 to HIDDEN_NEURONS - 1 do
    16.         HiddenOutputs[k] := FHiddenLayer[k].FeedForward(Input[i]); // Обращаетесь к k-ому элементу, но у массива нету SetLength
    17.  
     
    Cyber_Mozg нравится это.
  12. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Я понял массив Input многомерный и обращаться к нему через индекс неверно
     
  13. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Простите вы правы, не создан массив HiddenOutputs. ...
    --- Сообщение объединено, 28 окт 2024 ---
    Помоги плз, немного переделал с математикой что то почему то на выходе числа меньше 0, максимум 1, а должны быть >1000
    --- Сообщение объединено, 28 окт 2024 ---
    я так понимаю все дело в функции активации , но что же делать ? сменить ее ? на какую ?
     

    Вложения:

  14. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    122
    Не совсем. Чтобы числа были > 1000 можно так же оставить сигмоиду
    Код (Text):
    1. OutputFinal[k] := Sigmoid(OutputFinal[k] + FBiasO[k]);
    Cyber_Mozg, чтобы числа были > 1000 на выходном слое не надо применять функции активации.
     
  15. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Убрал... OutputFinal[k] := OutputFinal[k] + FBiasO[k];
    все равно, мало, Маштабировал Result := OutputFinal[0]*10;
    результаты чет не очень проверять буду
    --- Сообщение объединено, 29 окт 2024 ---
    Ребят, подскажите к примеру у меня сеть с 4 входами, данные у каждого входа отличаются по ращмерности, к примеру время в часа 0-23х, темп от-50 до +50в градусах ,и тд, нужна ли мне нормализация входных данных?
    --- Сообщение объединено, 29 окт 2024 ---
    Те выполнить маштабирование, чтобы по каждому входы данные были от 0 до 1
     
  16. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    122
    Если я правильно тебя понял то без нормализации можно сделать
     
  17. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    122
    Ты пытаешься обучить НС на типе array of array of Double,
    проблема из за этого. Это как начать строить дом с чердака
     
  18. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    как тогда лучше сделать?
     
  19. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    122
    Cyber_Mozg, сначала Inputs, Outputs: Double;
    Если все работает: Inputs, Outputs: array of Double;
    Код (Delphi):
    1. type
    2.   NeuralNet = record
    3.     CInp: integer;
    4.     InL: array of Double;
    5.     W1: array of Double;
    6.     Err: Double;
    7.     OutL: Double;
    8.   end;
    9.  
    10. const
    11.   learning_rate = 0.025;
    12.  
    13. var
    14.   NN: NeuralNet;
    15.  
    16. procedure UpdateNN(var NN: NeuralNet; InputArr: array of Double);
    17. var
    18.   i: integer;
    19.   Gradient: double;
    20. begin
    21.   for i := 0 to NN.CInp - 1 do
    22.   begin
    23.     Gradient := NN.err * learning_rate * InputArr[i];
    24.     NN.W1[i] := NN.W1[i] + Gradient;
    25.   end;
    26. end; //UpdateNN
    27.  
    28. procedure LearnNetwork(var NN: NeuralNet; InputArr: array of Double; Etalon: Double);
    29. var
    30.   i: integer;
    31.   Output: Double;
    32. begin
    33.   Output := 0;
    34.   for i := 0 to NN.CInp - 1 do
    35.   begin
    36.     Output := Output + InputArr[i] * NN.W1[i];
    37.   end;
    38.   NN.Err := Etalon - Output;
    39.   UpdateNN(NN, InputArr);
    40.   Writeln(NN.Err:0:5);
    41. end; //LearnNetwork
    42.  
    43. function Predict(var NN: NeuralNet; InputArr: array of Double): Double;
    44. var
    45.   i: integer;
    46. begin
    47.   for i := 0 to NN.CInp - 1 do
    48.   begin
    49.     NN.InL[i] := InputArr[i];
    50.   end;
    51.  
    52.   NN.OutL := 0;
    53.   for i := 0 to NN.CInp - 1 do
    54.   begin
    55.     NN.OutL := NN.OutL + NN.InL[i] * NN.W1[i];
    56.   end;
    57.  
    58.   Result := NN.OutL;
    59. end; //Predict
    60.  
    61. procedure OutputW1(NN: NeuralNet);
    62. var
    63.   i: Integer;
    64. begin
    65.   WriteLn('Weights 1: ');
    66.   for i := 0 to High(NN.W1) do
    67.   begin
    68.     WriteLn(NN.W1[i]:0:5);
    69.   end;
    70.   Writeln('');
    71. end; //OutputW1
    Сначала делаешь без Biases. Если все нормально, добавляешь Biases, скрытые слои, например.
    Еще надо следить за весами, чтобы избежать переполнения. Для этого есть L1, L2 регуляризация.
     
  20. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Спасибо вам большое! Попробую о результатах сообщу