Как обучить простейшую нейросеть?

Рейтинг: 0Ответов: 0Опубликовано: 16.02.2023

Имеется нейросеть с 2 входными нейронами и 1 выходным. Задача предсказать число (сложить 2 числа). Можно представить координатную прямую. Первый нейрон - текущее положение на оси X. Второй нейрон - на сколько изменилось значение на оси X. Например, 1 нейрон: 100, второй нейрон: 25, на выходе должно получиться 125. В теории оба веса должны быть = 1. Однако на практике у меня так не получилось сделать. Я пробовал % соотношение, то есть на сколько сильно вес повлиял на выход, на столько он и будет изменён. Однако ничего хорошего у меня не получилось. Стартовые веса я брал 0.6 и 0.4. (у меня получались веса 1.2 и 0.8, за 10к повторений они не поменялись) Объясните пожалуйста, какими действиями обучить нейросеть? Что нужно сделать? В высшей математике не разбираюсь (производные и т.д. не понимаю). C++

#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

float X = 0; //Входное значение (координата мыши X)
float V = 0; //Входное значение (на сколько переместились)
float W1 = 0; //вес 1
float W2 = 0; //вес 2
float S = 0; //сумма нейронов (конечный результат, предсказание)
int j = 0; //количество повторений (обучения)
float E = 0; //на сколько ошиблись
float EB = 0; //ошибки

int main()
{
    std::cout << "Vvedite Colichestvo povtorenii: " << std::endl;
    std::cin >> j;
    for (int i = 0; i < j; i++)
    {
        std::cout << "Vvedite nachalnui X: " << std::endl;
        std::cin >> X;
        std::cout << "Vvedite na skolko peremestilis: " << std::endl;
        std::cin >> V;
        //подгружаем веса
        setlocale(LC_ALL, "ru");

        string path = "test.txt";

        ifstream fin;

        fin.open(path);

        if (!fin.is_open())
        {
            cout << "Ошибка открытия файла!" << endl;
        }
        else
        {
            fin >> W1;
            fin >> W2;
        }
        fin.close();

        X = X * W1; //результат 1 нейрона
        V = V * W2; //результат 2 нейрона
        S = X + V; //сумма (выходное значение)
        std::cout << "Rezultat: " << S << std::endl;
        std::cout << "Vvedite sto dolzhno bilo poluchitza: " << std::endl;
        std::cin >> E;

        //рассчёт ошибки

        E = E - S; //находим на сколько ошиблись
        X = W1 / S; //находим % (так же пробовал находить % от суммы весов, а не от выходного значения)
        V = W2 / S; //находим %

        X = X * E; //умножаем ошибку на %
        V = V * E; //умножаем ошибку на %

        W1 = W1 + X;
        W2 = W2 + V;

        //для 1 запуска
        //W1 = 0.6;
        //W2 = 0.4;

        //новые веса
        std::cout << "W1: " << W1 << std::endl;
        std::cout << "W2: " << W2 << std::endl;

        setlocale(LC_ALL, "ru");

        ofstream fout;

        fout.open(path);

        if (!fout.is_open())
        {
            cout << "Ошибка открытия файла для записи!" << endl;
        }
        else
        {
            //выгружаем веса
            fout << W1;
            fout << W2;
        }
        fout.close();
        cout << "i: " << i << endl; //сколько выполнено проходов
    }
    return 0;
}

Ответы

Ответов пока нет.