Форум программистов, компьютерный форум CyberForum.ru

Алгоритм обратного распространения ошибки. Нейронные сети - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Функция удаления элемента из дерева, ошибка в коде http://www.cyberforum.ru/cpp-beginners/thread887580.html
Добрый вечер, уважаемые программисты! :) Помогите, пожалуйста, понять где здесь ошибка. static bool h = false; // узел дерева struct Tree {
C++ решение систем обыкновенных дифференциальных уравнений на си++ вот задание http://www.cyberforum.ru/cpp-beginners/thread887575.html
Написать программу проверки синтаксиса в логических операциях C++
На с++ нужно написать программу проверки синтаксиса в логических операциях,очень срочно
Есть ли утечка памяти в этом случае? C++
_Доброго денёчка всем. Прохожу тему на указатели и ссылки. Делаю упражнение на тему "написать программу, вызывающую утечку памяти". Смысл идеи "учись на ошибках и запомни как делать не нуна, а то будет ай-ай-ай". В книге приведён пример такой логической ошибки, когда в функции выполняется создание экземпляра класса, для которого оператором new в функции выделяется память. Затем ссылка на объект...
C++ Определить число нулей и единиц в массиве http://www.cyberforum.ru/cpp-beginners/thread887546.html
диапазон изменения значений элементов массива 0 или 1 Сделать два варианта программы: -элементы массива задаются пользователем -заполняются с помощью генератора случайных чисел
C++ Определить число нулей и единиц в массиве диапазон изменения значений элементов массива 0 или 1 Сделать два варианта программы: -элементы массива задаются пользователем -заполняются с помощью генератора случайных чисел подробнее

Показать сообщение отдельно
V0id
Сообщений: n/a
01.06.2013, 20:04     Алгоритм обратного распространения ошибки. Нейронные сети
Прошу помощи с реализацией алгоритма обратного распространения ошибки. Написал программу реализующую многослойный персептрон. Но никак не могу понять, почему не обучается сеть. После обучения выдаёт неправильные результаты. Для проверки я пытаюсь решить задачу аппроксимации квадратичной функции. Заранее благодарен за помощь в поиске своей ошибки.(Исходники прилагаются)
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
/************************************************
 *                                              *
 *  1 - Forward                                 *
 *  2 - Calculate output layers errors          *
 *  3 - Calculate hidden layers errors          *
 *  4 - Change output layer weights             *
 *  5 - Change hidden layers weights without    *
 *  last layer                                  *
 *  6 - Change first layer weights              *
 ************************************************/
    void Std(double dError, double p[][2], int nSize)
    {
        int nInCnt = m_pLayers[0].m_pNeurons[0].m_nPrevCount,
            nOutCnt = m_pLayers[m_nCount - 1].m_nCount;
        double  *pOut = new double[m_pLayers[m_nCount - 1].m_nCount],
                dSum = 0,
                dEOut = 0,
                dEEpoch = 0,
                dEAVG = 0;
        for (int nStep = 0; nStep < MAX_STEP /**&& (dEAVG / nStep) > dError**/; nStep++){
            // this epoch
            dEEpoch = 0;
            for (int i = 0; i < nSize / nInCnt; i++){ 
    /*1*/       Run(p[0] + i* nInCnt); //fwd    
                dEOut = 0;
                for (int nOuts = 0; nOuts < nOutCnt; nOuts++){ // fill array of outs and array of errors        
                    pOut[nOuts] = m_pLayers[m_nCount - 1].m_pNeurons[nOuts].m_dOut; // outs
                    dEOut += p[i * nOutCnt + nOuts][1] - pOut[nOuts];   //---------------
    /*2*/           m_pLayers[m_nCount - 1].m_pNeurons[nOuts].m_dError = (p[i * nOutCnt + nOuts][1] - pOut[nOuts]) * pOut[nOuts] * (1 - pOut[nOuts]); // errors out layer
                }
                dEOut /= nOutCnt;
                dEEpoch += dEOut;
    /*3*/       for (int nLayers = m_nCount - 2; nLayers >= 0; nLayers--){
                    for (int nNeurons = 0; nNeurons < m_pLayers[nLayers].m_nCount; nNeurons++){
                        dSum = 0;
                        for (int nPrevNeurons = 0; nPrevNeurons < m_pLayers[nLayers + 1].m_nCount; nPrevNeurons++){
                            dSum += m_pLayers[nLayers + 1].m_pNeurons[nPrevNeurons][nNeurons] * m_pLayers[nLayers + 1].m_pNeurons[nPrevNeurons].m_dError;
                        }
                        m_pLayers[nLayers].m_pNeurons[nNeurons].m_dError = dSum * m_pLayers[nLayers].m_pNeurons[nNeurons].m_dOut * (1 - m_pLayers[nLayers].m_pNeurons[nNeurons].m_dOut);
                    }
                }
    /*4*/       for (int nOutN = 0; nOutN < nOutCnt; nOutN++){
                    for (int nWeight = 0; nWeight < m_pLayers[m_nCount - 1].m_pNeurons[nOutN].m_nPrevCount; nWeight++){
                        (*this)[m_nCount - 1][nOutN][nWeight] += LEARN * m_pLayers[m_nCount - 1].m_pNeurons[nOutN].m_dError * m_pLayers[m_nCount - 2].m_pNeurons[nWeight].m_dOut;
                    }
                }
    /*5*/       for (int nHidden = m_nCount - 2; nHidden >= 1; nHidden--){
                    for (int nNeurons = 0; nNeurons < m_pLayers[nHidden].m_nCount; nNeurons++){
                        for (int nPrev = 0; nPrev < m_pLayers[nHidden].m_pNeurons[nNeurons].m_nPrevCount; nPrev++){
                            (*this)[nHidden][nNeurons][nPrev] += LEARN * m_pLayers[nHidden].m_pNeurons[nNeurons].m_dError * m_pLayers[nHidden-1].m_pNeurons[nPrev].m_dOut;
                        }
                    }
                }
                for (int nNeurons = 0; nNeurons < m_pLayers[0].m_nCount; nNeurons++){
                    for (int nPrev = 0; nPrev < m_pLayers[0].m_pNeurons[nNeurons].m_nPrevCount; nPrev++){
                        (*this)[0][nNeurons][nPrev] += LEARN * m_pLayers[0].m_pNeurons[nNeurons].m_dError * (p[0] + i* nInCnt)[nPrev];
                    }
                }
            }
            dEEpoch /= (nSize / nInCnt);
            dEAVG += dEEpoch;
        }
        delete[] pOut;
    }
////////////////////////////////////////////////////////////////////////
int main()
{
    int cnt[] = {2, 4, 4, 2};
    double in[][2] = {  {-1,1},
                        {-0.8, 0.64},
                        {-0.6, 0.36},
                        {-0.4, 0.16},
                        {-0.2, 0.04},
                        {0, 0},
                        {0.2, 0.04},
                        {0.4, 0.16},
                        {0.6, 0.36},
                        {0.8, 0.64},
                        {1, 1}},
                        test[] = {0.4, 0.6};
    CNW net(cnt, 4);
    net.Std(0.001, in, 10);
    net.Run(test);
    net.PrintOut();
    system("pause");
    return 0;
}
Вложения
Тип файла: rar MNL.rar (534.9 Кб, 32 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru