Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
-12 / 0 / 0
Регистрация: 31.03.2019
Сообщений: 33
1

Простая нейросеть

20.06.2019, 12:39. Просмотров 495. Ответов 1
Метки нет (Все метки)


Доброго времени суток!

Передо мной стоит задача создать простую нейросеть. Вот начальный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    int x1 = 1; // Начальные условия:
    int x2 = 0;
    int n = 1;
    float O_ideal = 1;
    float E = 0.7;//гиперпараметр, подбирается экспериментально
    float a = 0.3;//гиперпараметр, подбирается экспериментально
    
    float w1 = 0.45; // начальные значения весов нейросети
    float w2 = 0.78;
    float w3 = -0.12;
    float w4 = 0.13;
    float w5 = 1.5;
    float w6 = -2.3;
 
    float H1_input = x1*w1 + x2*w3; // Вычисление весов скрытого слоя:
    float H1_output = 1/(1+pow(2.72, -H1_input));
    float H2_input = x1*w2 + x2*w4;
    float H2_output = 1/(1+pow(2.72, -H2_input));
 
    float O_input = H1_output*w5 + H2_output*w6; //выход сети:
    float O_output = 1/(1+pow(2.72, -O_input));
    float MSE = pow((O_ideal - O_output), 2) / n; // вычисляем значение ошибки
 
cout << "Результат: " << O_output << endl;
    cout << "Ошибка: " << MSE << endl;
 
    float df = (1 - O_output)*O_output; // выполняем обратное распространение ошибки
    float del0 = (O_ideal - O_output)*df;
    float GRAD_w5 = del0*H1_output;
    float del_w5 = E*GRAD_w5;
 
    float GRAD_w6 = del0*H2_output;
    float del_w6 = E*GRAD_w6;
 
    float df_H1 = (1 - H1_output)*H1_output;
    float del_H1 = df_H1*w5*del0;
    float GRAD_w1 = del_H1*x1;
    float del_w1 = E*GRAD_w1 + a*0;
 
    float GRAD_w3 = del_H1*x2;
    float del_w3 = E*GRAD_w3 + a*0;
 
    float df_H2 = (1 - H2_output)*H2_output;
    float del_H2 = df_H2*w6*del0;
    float GRAD_w2 = del_H2*x1;
    float del_w2 = E*GRAD_w2 + a*0;
 
    float GRAD_w4 = del_H2*x2;
    float del_w4 = E*GRAD_w4 + a*0;
 
    w1 = w1 + del_w1; // обновляем веса
    w2 = w2 + del_w2;
    w3 = w3 + del_w3;
    w4 = w4 + del_w4;
    w5 = w5 + del_w5;
    w6 = w6 + del_w6;
 
    return 0;
}
Чтобы это доработать, нужно передать обновленные значения весов w1-w6 в начальные значения, снова все пересчитать (значение ошибки станет меньше), и так повторять до тех пор, пока значение ошибки не станет достаточно мало (например, 5%, это можно указать в условии цикла while).
В консоль нужно вывести весь процесс обучения, то есть последовательность всех промежуточных значений результата нейросети utput и ошибки MSE.
Логически понимаю, это должно выглядеть, только с реализацией немного забуксовал.

Буду признателен за любую помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2019, 12:39
Ответы с готовыми решениями:

Примитивная Нейросеть
Чую, что вопрос не для этой ветки, но так как в нейросетях совсем начинающий так что сюда, если что...

Нейросеть с рандомным исправлением коэффициентов
Помогите допилить код, а то начал оптимизировать в итоге хожу по граблям. У меня уже глаз...

Нейросеть распознание цифры в матрице
Здравствуйте, хочу написать нейронную сеть для распознавании цифр в двумерном массиве, почитал...

Такая нейросеть имеет право на жизнь?
Приветствую. Обратился ко мне товарищь с просьбой сделать нейронную сеть, чтобы она обучалась для...

1
1068 / 979 / 145
Регистрация: 19.02.2010
Сообщений: 3,015
22.06.2019, 00:46 2
Цитата Сообщение от Khatu Посмотреть сообщение
Передо мной стоит задача создать простую нейросеть.
Я бы сказал, что Вы пропустили решение задачи знакомства со стандартным набором сишных библиотечных функций
Иначе бы вместо pow(2.72, вызывали бы готовую функцию exp().

Цитата Сообщение от Khatu Посмотреть сообщение
Чтобы это доработать, нужно передать обновленные значения весов w1-w6 в начальные значения,
Так Вы уже и так изменили значения весов (строки 57-62).
Надо всего-то написать цикл (начало перед строкой 21, закрывающая скобка после строки 62). После строки 32 (чтобы текущая ошибка ушла на экран) вставьте условие, проверяющее значение переменной MSE и, при нужной малой ошибке, делающее брейк цикла.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2019, 00:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Что такое нейросеть и как ее сделать?
Здравствуйте! Я давно хотел где-нибудь спросить, как можно на C++ создать программу, которую...

Успею ли обучить нейросеть и встроить ее в проект?
Такая, собственно, задача. Нужно обучить простую нейросеть для распознавания и выделения одинаковых...

Нейросеть на FANN ошибка unresolved external '_fann_run' referenced from почему?
#include &lt;fann.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int main() {...

Простая нейросеть
Привет всем! Есть задача: Научить нейросеть ставить диагноз. 1 диагноз - 1 сеть. Сеть 3 слоя:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.