Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2023, 15:40   #1
brodnik
Пользователь
 
Регистрация: 28.01.2023
Сообщений: 35
По умолчанию С++ Нейронная сеть "Умножайка".

Код:
                                                      // Сеть 2 Х 10 Х 10 Х 1
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int f = 1;                        // флаг обучения
double ar1[2];                    // массив значений входов 1-го слоя
double ar12[10][2];               // массив значений весов с 1-го слоя на 2-й
double ar12_f[10][2];
double ar23_f[10][10];
double arW_f[10];
double ar2[10];                   // массив значений выходов 2-го слоя 
double ar23[10][10];              // массив значений весов с 2-го слоя на 3-й
double ar3[10];                   // массив значений выходов 3-го слоя
double arW[10];                   // массив значений весов с 3-го слоя на выходной
double arREZ[1];
double proizved[2];
double proizved2[10];
double proizvedw[10];
double summa = 0;
double srednee;
double wyh;
double a, b, c;
double REZ;
double L_r = 7;                 // learbing_rate 
double n[];
double m[];
double r[];
double z[];
double errW;
double err3[10];
double err2[10][10];
double deltaW;
double delta3[10];
double delta2[10];

int x, y;
int s;
int s2;
int q;


double NEURON(int s, int q, double n[], double m[][2], double z[])
{
    for (int i = 0; i < q; i++)
    {
        summa = 0;
        for (int j = 0; j < s; j++)
        {
            proizved[j] = n[j] * m[i][j];
            summa = summa + proizved[j];
        }
        srednee = summa / s;
        wyh = 1 / (1 + exp(-srednee));
        z[i] = wyh;
    }
    return wyh;
}

double NEURON23(int s2, int q, double n[], double m[][10], double z[])
{
    for (int i = 0; i < q; i++)
    {
        summa = 0;
        for (int j = 0; j < s2; j++)
        {
            proizved2[j] = n[j] * m[i][j];
            summa = summa + proizved2[j];
        }
        srednee = summa / s2;
        wyh = 1 / (1 + exp(-srednee));
        z[i] = wyh;
    }
    return wyh;
}


double NEURONW(int s2, int q, double n[], double r[], double z[])
{
    for (int i = 0; i < 1; i++)
    {
        summa = 0;
        for (int j = 0; j < 10; j++)
        {
            proizvedw[j] = n[j] * r[j];
            summa = summa + proizvedw[j];
        }
        srednee = summa / 10;
        wyh = 1 / (1 + exp(-srednee));
        z[i] = wyh;
    }
    return 0;
}

int main()
{
    setlocale(0, "");
    

    srand(time(NULL));                          
    for (int i = 0; i < 10; i++)
        for (int j = 0; j < 2; j++)
            ar12[i][j] = rand() / (float)RAND_MAX;
    

    srand(time(0) + 127);                         
    for (int i = 0; i < 10; i++)
        for (int j = 0; j < 10; j++)
            ar23[i][j] = rand() / (float)RAND_MAX;
    
    srand(time(NULL) + 375);                         
    for (int i = 0; i < 10; i++)
        arW[i] = rand() / (float)RAND_MAX;
 
    if (f == 0)               //   если не обучена
        void lesson();        //   вызываем функцию обучения
    else                      //   иначе приступаем к работе 
    {
        cout << "Введите первый сомножитель: ";
        cin >> ar1[0];
        cout << "Введите второй сомножитель: ";
        cin >> ar1[1];
        
        NEURON(2, 10, ar1, ar12, ar2);             
       
            
        NEURON23(10, 10, ar2, ar23, ar3);          // 2 - 3
        
         
        NEURONW(1, 10, ar3, arW, arREZ);           // 3 - W
        REZ = arREZ[0];
    }
    
   
    for (int i = 0; i < 300; i++)
    {                                                                           // Учимся
        errW = REZ - ((ar1[0] * ar1[1]) / 100);                                         // Ошибка выходного  
        deltaW = errW * (REZ * (1 - REZ));
        for (int i = 0; i < 10; i++)
            arW[i] = arW[i] - ar3[i] * deltaW * L_r;                            // Новые веса выходного
     
        ofstream outW;                                                              // поток для записи
        outW.open("D:\\um_w.txt");                                         // открываем файл для записи
        if (outW.is_open())
            for (int i = 0; i < 10; i++)
                outW << arW[i] << endl;
     

        for (int i = 0; i < 10; i++)
        {
            err3[i] = arW[i] * deltaW;                                          // Ошибки 3-го слоя
            delta3[i] = err3[i] * (ar3[i] * (1 - ar3[i]));                      //   новые дельта
            for (int j = 0; j < 10; j++)
                ar23[i][j] = ar23[i][j] - ar2[i] * delta3[i] * L_r;             // новые веса 3-го слоя
        }
        
        ofstream out23;                                                  
        out23.open("D:\\um_23.txt");                         
        if (out23.is_open())
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    out23 << ar23[i][j] << endl;
        
        for (int i = 0; i < 10; i++)
            for (int j = 0; j < 2; j++)
            {
                err2[i][j] = ar23[i][j] * delta3[i];                             // Ошибки 2-го слоя
                delta2[i] = err2[i][j] * (ar2[i] * (1 - ar2[i]));                //   новые дельта
                ar12[i][j] = ar12[i][j] - ar1[j] * delta2[i] * L_r;              // новые веса 2-го слоя
            }
        
        ofstream out12;       
        out12.open("D:\\um_12.txt"); 
        if (out12.is_open())
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 2; j++)
                    out12 << ar12[i][j] << endl;
        
       

        ifstream in("D:\\um_12.txt");                                     // открываем файл для чтения
        if (in.is_open())
        {
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 2; j++)
                    in >> ar12_f[i][j]; // << in << endl;
        }
        
        in.close();


        ifstream in23("D:\\um_23.txt"); 
        if (in23.is_open())
        {
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    in23 >> ar23_f[i][j]; // << in << endl;
        }
      
        in.close();


        ifstream inW("D:\\um_w.txt"); 
        if (inW.is_open())
        {
            for (int i = 0; i < 10; i++)
                inW >> arW_f[i]; // << in << endl;
        }
        
        in.close();
        
        NEURON(2, 10, ar1, ar12_f, ar2);             // 1 - 2
        
        
        NEURON23(10, 10, ar2, ar23_f, ar3);          // 2 - 3
      
          
        NEURONW(1, 10, ar3, arW, arREZ);           // 3 - W
        REZ = arREZ[0];
     
    }
    cout << ar1[0] << " X " << ar1[1] << " = " << REZ * 100 << endl;
 
    return 0;

Последний раз редактировалось brodnik; 20.02.2023 в 15:44.
brodnik вне форума Ответить с цитированием
Старый 20.02.2023, 15:46   #2
brodnik
Пользователь
 
Регистрация: 28.01.2023
Сообщений: 35
По умолчанию

Чур, ногами не пинать. Смеяться отвернувшись.
brodnik вне форума Ответить с цитированием
Старый 20.02.2023, 15:52   #3
brodnik
Пользователь
 
Регистрация: 28.01.2023
Сообщений: 35
По умолчанию

Пытаюсь дать ей последовательно всю таблицу умножения, все пары чисел, пока не очень получается. Она пользуется только теми весами, которые подобрала для последних пар. Может, слоев и нейронов мало?
brodnik вне форума Ответить с цитированием
Старый 21.02.2023, 08:51   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 980
По умолчанию

brodnik, опять на те же грабли:

1) про заголовки и using namespace std уж ладно, промолчу. Хотя, глаза режет
2) не нужно пользоваться сырыми массивами, используй классы
3) операции перемножения нужно сделать методами/операторами классов
4) ужас с глобальными переменными. В этом коде вообще не нужны глобальные, а ты их набубенил, да ещё с такими названиями. Используй локальные переменные
5)зачем функция NEURONW возвращает 0 ? Просто сделай возвращаемый тип void

ииии....
0) опиши задачу словами, русским языком. Забудь пока про код
Алексей1153 на форуме Ответить с цитированием
Старый 21.02.2023, 11:22   #5
brodnik
Пользователь
 
Регистрация: 28.01.2023
Сообщений: 35
По умолчанию

Функцию поправил и ... ничего не изменилось. (return wyh Как работала, так и работает. Может быть, если код будет значительно сложнее - тогда вылезет?
По остальному - задача в том и состоит, чтобы без классов, в рамках процедурного программирования.
По переменным - вы, конечно, правы, но для меня это не принципиально.
brodnik вне форума Ответить с цитированием
Старый 21.02.2023, 11:44   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 980
По умолчанию

brodnik, то есть, цель эксперимента - не использовать встроенную помощь языка. С этим никто помогать не станет
Алексей1153 на форуме Ответить с цитированием
Старый 21.02.2023, 12:01   #7
brodnik
Пользователь
 
Регистрация: 28.01.2023
Сообщений: 35
По умолчанию

Если бы цель была другая - я бы перешел на Пайтон. Мне нужна простота и наглядность, чтобы представлять себе работу реальных нейронов под своей черепной коробкой. ТАМ НЕТ КЛАССОВ И ВСТРОЕННОЙ ПОМОЩИ.
Правильнее было бы вообще на ассемблере это делать, но нет столько времени на изучение.
brodnik вне форума Ответить с цитированием
Старый 21.02.2023, 12:03   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 980
По умолчанию

brodnik, нейрон вполне себе оформляется в класс (суть - чёрная коробка с интерфейсом). Набор нейронов неплохо оформляется в класс "сеть".

без классов утонешь в коде. Без вариантов
Алексей1153 на форуме Ответить с цитированием
Старый 21.02.2023, 12:05   #9
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Цитата:
Сообщение от brodnik Посмотреть сообщение
ТАМ НЕТ КЛАССОВ
там объекты
Valick вне форума Ответить с цитированием
Старый 21.02.2023, 12:10   #10
brodnik
Пользователь
 
Регистрация: 28.01.2023
Сообщений: 35
По умолчанию

Как я уже писал выше, при подаче сети последовательно попарно всех чисел с первой десятки, она забывает начало таблицы. Следовательно, надо дать сразу все пары. Это 100 позиций. Надо увеличить количество нейронов до сотни. К выходному слою уменьшаться тоже надо постепенно, так что сеточка значительно вырастет. Чем сейчас и занимаюсь.
brodnik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
удалить папки из раздела "мой компьютер" - "сеть" Aлeкceй Безопасность, Шифрование 2 05.12.2011 18:10
МасОС не работает ,хоть и Видит,Интернет и "сломалась" "Сеть" =/ ApxuKILLER Операционные системы общие вопросы 2 05.05.2011 08:22