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

Нейронные сети на C++

01.05.2019, 17:22. Показов 3180. Ответов 71
Метки нет (Все метки)

Доброго времени суток. Решил начать изучать нейронки, попытался обучить нейросеть с обратным распространением ошибки. Обучение с учителем. Так вот, почему то когда в целевом векторе значение 0, тогда ошибка нейросети уменьшается, а при 1 увеличивается, вроде все как по учебнику делал. ПОмогите разобраться.
Для того чтобы понять правильно ли обучается сеть я решил не загружать много данных, а посмотреть как ведет себя программа на 30 парах, но как я понимаю, она ведет себя не так, как хотелось бы.
в коде много грязи и он не дописан, вплане условий, мне главное сейчас понять, как сделать так, чтобы сеть обучалась правильно, а потом уже буду основательно его переделывать. Что я делаю не правильно на данный момент, подскажите.
Вот код:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
//#include <graphics.h>
#include <conio.h>  // getch
#include <ctype.h>
#include <iostream>
#include <cmath> 
#include <ctime>
using namespace std;
float activ_fun(float NET)
{
    return 1 / (1 + exp(-NET));
}
float proizvod_activ_fun(float OUT)
{
    return OUT*(1 - OUT);
}
int main()
{
    
    float w1_1 = 0.3273, w1_2 = 0.2834, w1_3 = 0.5329;
    float w2_1 = 0.3542, w2_2 = 0.4374, w2_3 = 0.3202;
    float h = 0.6, cel = 0, delta_1 = 0, correctirovka_1 = 0, delta_2 = 0, correctirovka_2 = 0;
    float b1_1 = 0, b1_2 = 0, b1_3 = 0, b2_1 = 0;
    float vxod[27] = { 1.525296838, 0.464641648, 1.730666158, 0.267464594, 1.56444614,
                       0.526441276, 1.708979066, 0.648323876, 1.197653903, 0.075771303, 1.349625674,
                       0.394258738,1.400553145, 0.465213867, 1.525869057, 0.709551285,1.708979066, 
                       0.708406848, 1.709551285,0.647751657, 1.930666158, 0.267464594, 
                       1.56444614,0.197653903, 1.075771303, 0.394258738,1.400553145 };
    float vyxod[27] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
    for (int i = 0; i < 27; i++)
    {
        b1_1 = vxod[i] * w1_1;
        b1_2 = vxod[i] * w1_2;
        b1_3 = vxod[i] * w1_3;
        b1_1 = activ_fun(b1_1);
        b1_2 = activ_fun(b1_2);
        b1_3 = activ_fun(b1_3);
        b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
        b2_1 = activ_fun(b2_1);
        //cout << b2_1;
        cel = vyxod[i] - b2_1;
        cout << cel << endl;
        //if (cel > 0.0005)
        //  {
            delta_1 = -cel* proizvod_activ_fun(b2_1);
            correctirovka_1 = -delta_1*h*b1_1;
            w2_1 = w2_1 + correctirovka_1;
            correctirovka_1 = -delta_1*h*b1_2;
            w2_2 = w2_2 + correctirovka_1;
            correctirovka_1 = -delta_1*h*b1_3;
            w2_3 = w2_3 + correctirovka_1;
 
            //vtorye vesa
            delta_2 = proizvod_activ_fun(b1_1)*delta_1*w2_1;
            correctirovka_2 = -delta_2*vxod[i] * h;
            w1_1 = w1_1 + correctirovka_2;
            delta_2 = proizvod_activ_fun(b1_2)*delta_1*w2_2;
            correctirovka_2 = -delta_2*vxod[i] * h;
            w1_2 = w1_2 + correctirovka_2;
            delta_2 = proizvod_activ_fun(b1_3)*delta_1*w2_3;
            correctirovka_2 = -delta_2*vxod[i] * h;
            w1_3 = w1_3 + correctirovka_2;
            //cout << w1_1 << endl;
            //cout << w1_2 << endl;
            //cout << w1_3 << endl;
            //cout << w2_1 << endl;
            //cout << w2_2 << endl;
            //cout << w2_3 << endl;
         // }
        //else
        //{
        //  break;
        //}
        
        //cout << b2_1<< " ";
    }
    float k = 1.56444614;
    b1_1 = k * w1_1;
    b1_2 = k * w1_2;
    b1_3 = k * w1_3;
    b1_1 = activ_fun(b1_1);
    b1_2 = activ_fun(b1_2);
    b1_3 = activ_fun(b1_3);
    b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
    b2_1 = activ_fun(b2_1);
    cout << b2_1;
    return 0;
}
Добавлено через 3 минуты
Сеть у меня с тремя нейронами в скрытом слое и 1 выходным нейроном.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2019, 17:22
Ответы с готовыми решениями:

Нейронные сети (адаптивные сети)
нужен исходник 3д или 2д адаптивной сетки для небольшого использования в своей работе...

Нейронные сети
Добрый вечер, товарищи. Прошу у вас помощи по нейронным сетям. Есть обучающие выборка, там...

Нейронные сети
Недавно открыл для себя тему нейросетей, и хотел бы спросить ресурс где бы я смог довольствоваться...

Нейронные сети
Добрый вечер! Можете подсказать где есть много примеров по нейронным сетям...? Хотелось бы...

71
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 18:53 2
Цитата Сообщение от Sukharev_K Посмотреть сообщение
Сеть у меня с тремя нейронами в скрытом слое и 1 выходным нейроном.
Что вы хотите подать на каждый нейрон в качестве входа и какую задачу должна решить нейронка?
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 19:12  [ТС] 3
На вход будут подаваться числа, аналогичные, что находятся в массиве vxod.
Задача нахождения выбросов, наверно так ее можно описать, тоесть до определенного значения входа выход должен быть 0, а если значение больше, то уже 1.
на вход я пытаюсь подать одно число, после прохода нахожу разность с целевым выходом и пытаюсь подкорректировать веса.
вот такую сеть пытаюсь реализовать.
0
Миниатюры
Нейронные сети на C++  
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 19:53  [ТС] 4
Я попытался вывести информацию о разнице между целевым вектором и выходом сети.
Видно что для 1 в целевом векторе ошибка уменьшается, а для нуля увеличивается.
последнее значения на скриншоте не учитывается, это я уже попробовал подать на сеть значение.
0
Миниатюры
Нейронные сети на C++  
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 20:11 5
Цитата Сообщение от Sukharev_K Посмотреть сообщение
тоесть до определенного значения входа выход должен быть 0, а если значение больше, то уже 1.
Из этой фразы, вам наверное логичнее иметь не сигмоиду активационную функцию, а ступеньку с пороговым значением активации.
Сеть прямого распространения с одним скрытом слоем, вроде как, реализует аналог мнк решения, если я не ошибаюсь. Но это не точно
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 20:18  [ТС] 6
Да это просто начало, в дальнейшем может быть 3 или 5 состояний, к примеру 0, 0.5 1 в целевом векторе.
Именно поэтому и хочу сейчас попробовать реализовать с сигмоидой, чтобы результат после обучения был 0.99995 к примеру для единицы, ну и с такой же точностью для нуля.
Может на выборке из 27 элементов нельзя судить как идет обучение?
0
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 20:19 7
Цитата Сообщение от Sukharev_K Посмотреть сообщение
C++
1
delta_1 = -cel* proizvod_activ_fun(b2_1); correctirovka_1 = -delta_1*h*b1_1; w2_1 = w2_1 + correctirovka_1; correctirovka_1 = -delta_1*h*b1_2; w2_2 = w2_2 + correctirovka_1; correctirovka_1 = -delta_1*h*b1_3; w2_3 = w2_3 + correctirovka_1; //vtorye vesa delta_2 = proizvod_activ_fun(b1_1)*delta_1*w2_1; correctirovka_2 = -delta_2*vxod[i] * h; w1_1 = w1_1 + correctirovka_2; delta_2 = proizvod_activ_fun(b1_2)*delta_1*w2_2; correctirovka_2 = -delta_2*vxod[i] * h; w1_2 = w1_2 + correctirovka_2; delta_2 = proizvod_activ_fun(b1_3)*delta_1*w2_3; correctirovka_2 = -delta_2*vxod[i] * h; w1_3 = w1_3 + correctirovka_2;
Корректировки всех весов производятся от младшего к старшему, только после того как вы посчитали все дельты
Цитата Сообщение от Sukharev_K Посмотреть сообщение
Может на выборке из 27 элементов нельзя судить как идет обучение
Можно, более того, по идее, она должна уметь "переобучиться" в какое-то конкретное значение
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 20:21  [ТС] 8
Младший это скрытый?
Тоесть сначала считаем все корректировки со старыми весами, а потом уже все их корректируем, правильно понял?)
0
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 20:22 9
Да, сначала скрытые считаем, потом выходной ( т.к изменение в младших весах зависит от старшего слоя, но не наоборот)
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 20:57  [ТС] 10
Сейчас переделаю и отпишусь, скину, что получилось)

Добавлено через 26 минут
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
//#include <graphics.h>
#include <conio.h>  // getch
#include <ctype.h>
#include <iostream>
#include <cmath> 
#include <ctime>
using namespace std;
float activ_fun(float NET)
{
    return 1 / (1 + exp(-NET));
}
float proizvod_activ_fun(float OUT)
{
    return OUT*(1 - OUT);
}
int main()
{
 
    float w1_1 = 0.3273, w1_2 = 0.2834, w1_3 = 0.5329;
    float w2_1 = 0.3542, w2_2 = 0.4374, w2_3 = 0.3202;
    float h = 0.6, cel = 0, delta_1 = 0, correctirovka_1 = 0, delta_2 = 0, correctirovka_2 = 0;
    float correctirovka[6];
    float delta[4];
    float b1_1 = 0, b1_2 = 0, b1_3 = 0, b2_1 = 0;
    float vxod[27] = { 1.525296838, 0.464641648, 1.730666158, 0.267464594, 1.56444614,
        0.526441276, 1.708979066, 0.648323876, 1.197653903, 0.075771303, 1.349625674,
        0.394258738,1.400553145, 0.465213867, 1.525869057, 0.709551285,1.708979066,
        0.708406848, 1.709551285,0.647751657, 1.930666158, 0.267464594,
        1.56444614,0.197653903, 1.075771303, 0.394258738,1.400553145 };
    float vyxod[27] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
    for (int i = 0; i < 27; i++)
    {
        b1_1 = vxod[i] * w1_1;
        b1_2 = vxod[i] * w1_2;
        b1_3 = vxod[i] * w1_3;
        b1_1 = activ_fun(b1_1);
        b1_2 = activ_fun(b1_2);
        b1_3 = activ_fun(b1_3);
        b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
        b2_1 = activ_fun(b2_1);
        cel = vyxod[i] - b2_1;
        cout << cel << endl;
        
 
        //vyxodnoi sloi
        delta[0] = -cel* proizvod_activ_fun(b2_1);
        correctirovka[0] = -delta[0]*h*b1_1;
        //w2_1 = w2_1 + correctirovka[1];
        correctirovka[1] = -delta[0]*h*b1_2;
        //w2_2 = w2_2 + correctirovka[1];
        correctirovka[2] = -delta[0]*h*b1_3;
        //w2_3 = w2_3 + correctirovka[1];
 
        // skrytyi sloi + correctirovka vesov
        delta[1] = proizvod_activ_fun(b1_1)*delta[0]*w2_1;
        correctirovka[3] = -delta[2]*vxod[i] * h;
        w1_1 = w1_1 + correctirovka_2;
        delta[2] = proizvod_activ_fun(b1_2)*delta[0]*w2_2;
        correctirovka[4] = -delta[3]*vxod[i] * h;
        w1_2 = w1_2 + correctirovka[5];
        delta[3] = proizvod_activ_fun(b1_3)*delta[0]*w2_3;
        correctirovka[5] = -delta[4]*vxod[i] * h;
        w1_3 = w1_3 + correctirovka[6];
        
        //корректируем веса выходного слоя.
        w2_1 = w2_1 + correctirovka[0];
        w2_2 = w2_2 + correctirovka[1];
        w2_3 = w2_3 + correctirovka[2];
 
    }
    float k = 1.56444614;
    b1_1 = k * w1_1;
    b1_2 = k * w1_2;
    b1_3 = k * w1_3;
    b1_1 = activ_fun(b1_1);
    b1_2 = activ_fun(b1_2);
    b1_3 = activ_fun(b1_3);
    b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
    b2_1 = activ_fun(b2_1);
    cout << b2_1;
    return 0;
}
Вот так вот??

Добавлено через 3 минуты
Тоесть я сначала просто посчитал корректировки для выходного слоя, но не менял пока веса, потом посчитал корректировки во внутреннем слое и сразу пересчитал веса, а уже после этого изменил веса на выходном слое, все так я сделал?)
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 21:00  [ТС] 11
Теперь чего то вся разность начала увеличиваться, походу я опять что то напутал..
0
Миниатюры
Нейронные сети на C++  
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 21:31 12
Цитата Сообщение от Sukharev_K Посмотреть сообщение
delta[1] = proizvod_activ_fun(b1_1)*delta[0]*w2_1; correctirovka[3] = -delta[2]*vxod[i] * h; w1_1 = w1_1 + correctirovka_2; delta[2] = proizvod_activ_fun(b1_2)*delta[0]*w2_2;
Сначала используете delta[2], потом её считаете? Выглядит сомнительно. С остальными также
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 21:33  [ТС] 13
ой да, напутал, щас исправлю.
0
3408 / 2767 / 751
Регистрация: 25.03.2012
Сообщений: 10,041
Записей в блоге: 1
01.05.2019, 21:38 14
Sukharev_K, не слишком ли велик коефф-т обучения?
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 21:38  [ТС] 15
Исправил, вроде теперь все правильно должно быть..
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
//#include <graphics.h>
#include <conio.h>  // getch
#include <ctype.h>
#include <iostream>
#include <cmath> 
#include <ctime>
using namespace std;
float activ_fun(float NET)
{
    return 1 / (1 + exp(-NET));
}
float proizvod_activ_fun(float OUT)
{
    return OUT*(1 - OUT);
}
int main()
{
 
    float w1_1 = 0.3273, w1_2 = 0.2834, w1_3 = 0.5329;
    float w2_1 = 0.3542, w2_2 = 0.4374, w2_3 = 0.3202;
    float h = 0.6, cel = 0, delta_1 = 0, correctirovka_1 = 0, delta_2 = 0, correctirovka_2 = 0;
    float correctirovka[6];
    float delta[4];
    float b1_1 = 0, b1_2 = 0, b1_3 = 0, b2_1 = 0;
    float vxod[27] = { 1.525296838, 0.464641648, 1.730666158, 0.267464594, 1.56444614,
        0.526441276, 1.708979066, 0.648323876, 1.197653903, 0.075771303, 1.349625674,
        0.394258738,1.400553145, 0.465213867, 1.525869057, 0.709551285,1.708979066,
        0.708406848, 1.709551285,0.647751657, 1.930666158, 0.267464594,
        1.56444614,0.197653903, 1.075771303, 0.394258738,1.400553145 };
    float vyxod[27] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
    for (int i = 0; i < 27; i++)
    {
        b1_1 = vxod[i] * w1_1;
        b1_2 = vxod[i] * w1_2;
        b1_3 = vxod[i] * w1_3;
        b1_1 = activ_fun(b1_1);
        b1_2 = activ_fun(b1_2);
        b1_3 = activ_fun(b1_3);
        b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
        b2_1 = activ_fun(b2_1);
        cel = vyxod[i] - b2_1;
        cout << cel << endl;
 
 
        //vyxodnoi sloi
        delta[0] = cel* proizvod_activ_fun(b2_1);
        correctirovka[0] = delta[0] * h*b1_1;
        //w2_1 = w2_1 + correctirovka[1];
        correctirovka[1] = delta[0] * h*b1_2;
        //w2_2 = w2_2 + correctirovka[1];
        correctirovka[2] = delta[0] * h*b1_3;
        //w2_3 = w2_3 + correctirovka[1];
 
        // skrytyi sloi + correctirovka vesov
        delta[1] = proizvod_activ_fun(b1_1)*delta[0] * w2_1;
        correctirovka[3] = delta[1] * vxod[i] * h;
        w1_1 = w1_1 + correctirovka[3];
        delta[2] = proizvod_activ_fun(b1_2)*delta[0] * w2_2;
        correctirovka[4] = delta[2] * vxod[i] * h;
        w1_2 = w1_2 + correctirovka[5];
        delta[3] = proizvod_activ_fun(b1_3)*delta[0] * w2_3;
        correctirovka[5] = delta[3] * vxod[i] * h;
        w1_3 = w1_3 + correctirovka[5];
 
        //корректируем веса выходного слоя.
        w2_1 = w2_1 + correctirovka[0];
        w2_2 = w2_2 + correctirovka[1];
        w2_3 = w2_3 + correctirovka[2];
 
    }
    float k = 1.56444614;
    b1_1 = k * w1_1;
    b1_2 = k * w1_2;
    b1_3 = k * w1_3;
    b1_1 = activ_fun(b1_1);
    b1_2 = activ_fun(b1_2);
    b1_3 = activ_fun(b1_3);
    b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
    b2_1 = activ_fun(b2_1);
    cout << b2_1;
    return 0;
}
так вот?)
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 21:40  [ТС] 16
Думаете это очень влияет на такое изменение разностей?
0
Миниатюры
Нейронные сети на C++  
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 21:47 17
Цитата Сообщение от Sukharev_K Посмотреть сообщение
Думаете это очень влияет на такое изменение разностей?
Видимо это не единственная ошибка)
Цитата Сообщение от Sukharev_K Посмотреть сообщение
w1_2 = w1_2 + correctirovka[5]; delta[3] = proizvod_activ_fun(b1_3)*delta[0] * w2_3; correctirovka[5] = delta[3] * vxod[i] * h; w1_3 = w1_3 + correctirovka[5]
В обоих случаях используется корректировка correctirovka[5]
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 21:53  [ТС] 18
Исправил, извиняюсь за такие глупые ошибки просто глаза уже в кучку, вторые сутки пытаюсь добиться положительного результата..)))
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
//#include <graphics.h>
#include <conio.h>  // getch
#include <ctype.h>
#include <iostream>
#include <cmath> 
#include <ctime>
using namespace std;
float activ_fun(float NET)
{
    return 1 / (1 + exp(-NET));
}
float proizvod_activ_fun(float OUT)
{
    return OUT*(1 - OUT);
}
int main()
{
 
    float w1_1 = 0.3273, w1_2 = 0.2834, w1_3 = 0.5329;
    float w2_1 = 0.3542, w2_2 = 0.4374, w2_3 = 0.3202;
    float h = 0.3, cel = 0, delta_1 = 0, correctirovka_1 = 0, delta_2 = 0, correctirovka_2 = 0;
    float correctirovka[6];
    float delta[4];
    float b1_1 = 0, b1_2 = 0, b1_3 = 0, b2_1 = 0;
    float vxod[27] = { 1.525296838, 0.464641648, 1.730666158, 0.267464594, 1.56444614,
        0.526441276, 1.708979066, 0.648323876, 1.197653903, 0.075771303, 1.349625674,
        0.394258738,1.400553145, 0.465213867, 1.525869057, 0.709551285,1.708979066,
        0.708406848, 1.709551285,0.647751657, 1.930666158, 0.267464594,
        1.56444614,0.197653903, 1.075771303, 0.394258738,1.400553145 };
    float vyxod[27] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
    for (int i = 0; i < 27; i++)
    {
        b1_1 = vxod[i] * w1_1;
        b1_2 = vxod[i] * w1_2;
        b1_3 = vxod[i] * w1_3;
        b1_1 = activ_fun(b1_1);
        b1_2 = activ_fun(b1_2);
        b1_3 = activ_fun(b1_3);
        b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
        b2_1 = activ_fun(b2_1);
        cel = vyxod[i] - b2_1;
        cout << cel << endl;
 
 
        //vyxodnoi sloi
        delta[0] = cel* proizvod_activ_fun(b2_1);
        correctirovka[0] = delta[0] * h*b1_1;
        //w2_1 = w2_1 + correctirovka[1];
        correctirovka[1] = delta[0] * h*b1_2;
        //w2_2 = w2_2 + correctirovka[1];
        correctirovka[2] = delta[0] * h*b1_3;
        //w2_3 = w2_3 + correctirovka[1];
 
        // skrytyi sloi + correctirovka vesov
        delta[1] = proizvod_activ_fun(b1_1)*delta[0] * w2_1;
        correctirovka[3] = delta[1] * vxod[i] * h;
        w1_1 = w1_1 + correctirovka[3];
        delta[2] = proizvod_activ_fun(b1_2)*delta[0] * w2_2;
        correctirovka[4] = delta[2] * vxod[i] * h;
        w1_2 = w1_2 + correctirovka[4];
        delta[3] = proizvod_activ_fun(b1_3)*delta[0] * w2_3;
        correctirovka[5] = delta[3] * vxod[i] * h;
        w1_3 = w1_3 + correctirovka[5];
 
        //корректируем веса выходного слоя.
        w2_1 = w2_1 + correctirovka[0];
        w2_2 = w2_2 + correctirovka[1];
        w2_3 = w2_3 + correctirovka[2];
 
    }
    float k = 1.56444614;
    b1_1 = k * w1_1;
    b1_2 = k * w1_2;
    b1_3 = k * w1_3;
    b1_1 = activ_fun(b1_1);
    b1_2 = activ_fun(b1_2);
    b1_3 = activ_fun(b1_3);
    b2_1 = b1_1*w2_1 + b1_2*w2_2 + b1_3*w2_3;
    b2_1 = activ_fun(b2_1);
    cout << b2_1;
    return 0;
}
0
21 / 16 / 5
Регистрация: 22.06.2015
Сообщений: 68
01.05.2019, 21:58 19

Не по теме:

Цитата Сообщение от Sukharev_K Посмотреть сообщение
вторые сутки пытаюсь добиться положительного результата
Из моего опыта, это только начало)))


Только сейчас пришло в голову- зачем три нейрона с одинаковым значением входа? Возможно она неправильно работает из-за неправильной архитектуры
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 40
01.05.2019, 21:58  [ТС] 20
Есть у меня еще подозрения, что может там где то в формулка минус нужно поставить, я прошарил инет где в дельта ставится, где то нет, я попробовал, но результата положительного не получилось.
И еще один вариант был попробовать как то сделать на подобии этого, что на фото, типо если разница отрицательна, то я вычитал коректировку, если положительна, то прибавлял, но это должного результата так же не принесло..
0
Миниатюры
Нейронные сети на C++   Нейронные сети на C++  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2019, 21:58

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Книги по С++ и нейронные сети
Уважаемые форумчане, может кто посоветовать книги (или статьи в интернете) по созданию нейронных...

Капсульные нейронные сети
Здравствуйте! Подскажите, подходит ли фреймворк JUCE для реализации капсульной нейронной сети на...

Нейронные сети(персептрон)
Привет всем. Недавно начал изучать нейронные сети. Понравилось, очень интересно. Хочу...

Нейронные сети. Перцептрон Розенблата
Здравствуйте! Помогите разобраться в коде (напишите комментарии). Уже несколько дней пытался...


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

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

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