Форум программистов, компьютерный форум, киберфорум
C#: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 4 / 1
Регистрация: 23.09.2012
Сообщений: 49

Чудит нейронная сеть некоректный выход

10.04.2020, 17:54. Показов 579. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени, изучаю Нейронные Сети (НС) написал небольшой кусок, пытаюсь научить на XOR на выходе, что попало,
причем для разных конфигураций сети разные выходные цифры, но они не истинны.
Пробовал давать фиксированные данные и считал за ней, все верно, и вперед и назад и поправку на весы.... может не по тем формулам , может просто лыжы , не могу найти где ошибка, прошу помочь Код ниже, так же прилагаю проект в визуалке...
Кликните здесь для просмотра всего текста

КОТ
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
 
namespace Test
{
    public class Program
    {
 
        static void Main(string[] args)
        {
            NeuronNetwork NN_Lay;
            int[] layers_NeuralNumb = new int[] {  2, 3, 1 }; // конфиг сети
 
            double[,] inp_Data = new double[,] { { 0, 0 }, 
                                                 { 0, 1 },
                                                 { 1, 0 },
                                                 { 1, 1 } }; // Обучающий масив 
 
            double[] ideal = new double[] { 0, 1, 1, 0 }; // Масив ответов
 
            // создаём генератор случайных чисел
            Random random = new Random(DateTime.Now.Millisecond);
 
 
            NN_Lay = new NeuronNetwork(layers_NeuralNumb, random);
 
 
            NN_Lay.Training(ref NN_Lay, 0.001, layers_NeuralNumb, ideal, inp_Data, 10000); // Обуем
 
            Console.ReadLine();
 
 
        }
    }
 
 
    struct LayT
    {
 
        public neuronT[] Neuron;
    }
    struct neuronT
    {
        public double[] weghits; //веса выходных синапсов
        public double error; // ошибка 
        public double x; // Вход нейрона
        public double y; // Выход после функции активации
        public double df; // Производная 
 
 
    }
 
    class NeuronNetwork
    {
        LayT[] Lay;
        int[] layers_NeuralNumb;
 
        public NeuronNetwork(int[] layers_NeuralNumb, Random random)
        {
            this.layers_NeuralNumb = layers_NeuralNumb;
 
            Lay = new LayT[layers_NeuralNumb.Length];
 
            for (int count_lay = 0; count_lay < layers_NeuralNumb.Length; count_lay++)
            {
                Lay[count_lay].Neuron = new neuronT[layers_NeuralNumb[count_lay]];
 
                for (int count_neuron = 0; count_neuron < layers_NeuralNumb[count_lay]; count_neuron++)
                {
 
                    if (Lay.Length - 1 == count_lay)
                        Lay[count_lay].Neuron[count_neuron].weghits = new double[0];
                    else
                        Lay[count_lay].Neuron[count_neuron].weghits = new double[layers_NeuralNumb[count_lay + 1]];
 
                    // Lay[count_lay].Neuron[count_neuron].x = random.NextDouble() - 0.5; // Заполняем рандомом входа нейронов
                    // Lay[count_lay].Neuron[count_neuron].y = 1 / (1 + Math.Exp(-Lay[count_lay].Neuron[count_neuron].x)); // Заполняем рандомом выхода 
 
                    for (int i = 0; i < Lay[count_lay].Neuron[count_neuron].weghits.Length; i++)
                        Lay[count_lay].Neuron[count_neuron].weghits[i] = random.NextDouble() - 0.5;
                }
            }
 
        }
 
        public void Forward()
        {
            double temp, temp2;
            for (int i = 1; i < layers_NeuralNumb.Length; i++) // Идем по слоям
            {
                for (int j = 0; j <= layers_NeuralNumb[layers_NeuralNumb.Length - 1]; j++) // идем по нейронам
                {
                    try // Костыль НАДО ПОФИКСИТЬ!!!!
                    {
                        Lay[i].Neuron[j].x = 0;
                        Lay[i].Neuron[j].y = 0;
                    }
                    catch { break; }
                    for (int w = 0; w < layers_NeuralNumb[i - 1]; w++) // идем по весам
                    {
                        temp2 = Lay[i - 1].Neuron[w].weghits[j] * Lay[i - 1].Neuron[w].y;
                        Lay[i].Neuron[j].x += Lay[i - 1].Neuron[w].weghits[j] * Lay[i - 1].Neuron[w].y;
 
 
                    }
 
                    Lay[i].Neuron[j].y = 1 / (1 + Math.Exp(-Lay[i].Neuron[j].x));
                    Lay[i].Neuron[j].df = Lay[i].Neuron[j].y * (1 - Lay[i].Neuron[j].y);
                }
 
            }
 
        }
 
        public void Backward(double[] ideal) //ref double error)
        {
 
            //error = 0; // обнуляем ошибку
            for (int i = layers_NeuralNumb.Length - 1; i >= 0; i--)
            {
                if (i == 0) { break; }
                for (int j = 0; j <= Lay[i].Neuron.Length - 1; j++)
                {
                    Lay[i].Neuron[j].error = 0; // чистим ячейку
 
                    if (i != layers_NeuralNumb.Length - 1) // если не последний слой 
                    {
                        for (int w = 0; w < Lay[i + 1].Neuron.Length; w++)
                        {
                            Lay[i].Neuron[j].error += Lay[i].Neuron[j].weghits[w] * Lay[i + 1].Neuron[w].error;
                            // Lay[i].Neuron[j].error *= Lay[i].Neuron[j].df;
                        }
                    }
                    else // если последний слой сети
                    {
                        Lay[i].Neuron[j].error = ideal[j] - Lay[i].Neuron[j].y;
                    }
 
                }
            }
 
        }
 
        public void Updating_Weights(double Kn) // Обновление весов 
        {
            int temp3 = 0; // для теста
            double temp = 0.0;
            for (int i = 1; i < layers_NeuralNumb.Length; i++) // Идем по слоям сети начинаем с 1 т к 0 это дендриты
            {
                temp3 = layers_NeuralNumb[i - 1]; // Переменная костыль если один нйрон в слою
 
                for (int j = 0; j < temp3; j++)
                {
 
                    for (int k = 0; (k < layers_NeuralNumb[i]); k++)
                    {
                        temp = Lay[i].Neuron[k].y * (1 - Lay[i].Neuron[k].y); // Для проверки производной
 
                        if (layers_NeuralNumb[i] == 1) // если текушем слою 1 нейрон
                        {
                            // Новый вес нейрона предыдущего слоя = старый вес нейрона предыдущего слоя + Коэф_Обучения * Ошибка нейрона * Производная нейрона * Выходное значение нейрона
 
                            Lay[i - 1].Neuron[j].weghits[k] += Kn * Lay[i].Neuron[k].error * temp* Lay[i].Neuron[0].x;
                            //Lay[i - 1].Neuron[j].weghits[k] -= Kn * Lay[i].Neuron[k].error * Lay[i].Neuron[0].y;
                            if (temp3 == layers_NeuralNumb[i])
                                temp3++;
                        }
                        else
                            Lay[i - 1].Neuron[j].weghits[k] += Kn * Lay[i].Neuron[k].error * temp * Lay[i].Neuron[j].x;
                        //Lay[i - 1].Neuron[j].weghits[k] -= Kn * Lay[i].Neuron[k].error * Lay[i].Neuron[j].y;
                    }
                }
            }
        }
 
        public void Training(ref NeuronNetwork NN, double Kn, int[] layers_NeuralNumb, double[] ideal, double[,] inp_Data, int epoch)
        {
            int epoch_Count = 0;
            double[] ideal_Main = new double[layers_NeuralNumb[0]];
 
            do
            {
 
                for (int i = 0; i < (inp_Data.Length / layers_NeuralNumb[0]); i++) // Перебираем примеры
                {
                    for (int j = 0; j < layers_NeuralNumb[0]; j++)//Перебираем нейроны
                    {
                        NN.Lay[0].Neuron[j].y = inp_Data[i, j];
 
                        ideal_Main[j] = ideal[i]; // подставляем нужный ответ, для примера
                    }
 
 
                    NN.Forward(); // Прямое
                    NN.Backward(ideal_Main); // обратное 
                    NN.Updating_Weights(Kn); // обновление весов|
 
                    Console.WriteLine("X1 {0} \nX2 {1} \nideal {2} \nNN_out {3}",
                        NN.Lay[0].Neuron[0].y, NN.Lay[0].Neuron[1].y, ideal_Main[0], (double)NN.Lay[2].Neuron[0].y); // 
                }
 
                Console.WriteLine("Эпоха {0}", epoch_Count); // 
 
                epoch_Count++;
            }
            while (epoch_Count <= epoch);
        }
 
 
        public LayT this[int i]
        {
            get { return Lay[i]; } // получение значения
            set { Lay[i] = value; } // изменение значения
        }
 
 
 
 
 
    }
}
Вложения
Тип файла: rar Test.rar (21.1 Кб, 1 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2020, 17:54
Ответы с готовыми решениями:

Нейронная сеть
Обучить нейронную сеть, проект почти полностью доделан осталось дописать несколько методов, помогите пожалуйста:(

Простая нейронная сеть
Доброго времени суток, встал такой вопрос: Имеется неравенство x1 - x2 + 0.5 &gt;= 0. Это неравенство разделяет систему координат на 2 части...

Нейронная сеть школьника
Здравствуйте , помогите с нейронной сетью. Написал простую нейронную на c# все работает с одним слоем , но когда подключаю второй то все...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2020, 17:54
Помогаю со студенческими работами здесь

Нейронная сеть не работает. Почему?
using System; //Neiron using System.Collections.Generic; using...

[Нейронная сеть] Разгадывание цифр
Дайте ссылки на хорошие статьи по этому поводу, нужно осуществить вот такое разгадывание, мне кажется это не сильно сложно, но в нейронных...

Нейронная сеть - крестики нолики
Помогите научить нейросеть играть в крестики-нолики. (если возможно, то алгоритмом back propagation)

Нейронная сеть Розенблата
Может кто-нибудь реализовывал? а то совсем не хочется писать -_-

Нейронная сеть на c++ - многослойный перцептрон
Уважаемые форумчане нужна ваша помощь с нейронной сетью на c++! На днях захотел написать прогу - многослойный перцептрон на c++, вроде...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru