Сети... Delphi

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

  1. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    208
    Адрес:
    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
    Сообщения:
    208
    Адрес:
    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 в 16:56 ---
    одномерный вещественный числа в нем представлены [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
    Сообщения:
    208
    Адрес:
    Russia
    Проблема началась с того что захотел в консоле просмотреть какие данные формируются в массивах
     

    Вложения:

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

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    430
    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
    Сообщения:
    208
    Адрес:
    Russia
    Так я понял директива создания двух мерного массива array of array, почему же array of TLayer; создаёт тоже двух мерный?
    --- Сообщение объединено, 13 окт 2024 в 22:38 ---
    И объясните плз что возвращает метод nn. Forward
     
  8. Cyber_Mozg

    Cyber_Mozg Andrey

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

    MaKsIm Member

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