Форум программистов, компьютерный форум, киберфорум
C#: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/64: Рейтинг темы: голосов - 64, средняя оценка - 4.67
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54

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

21.01.2013, 14:18. Показов 13901. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Для моей научной работы мне понадобился двухслойный персптрон (вместо реализованного однослойного). Алгоритм обучения использовал - BP (алгоритм обратного распространения ошибки).
Параметры ИНС: Входной слой - 1000000 нейронов (50 изображений, 100х200 pix - зачем - не спрашивать), скрытый слой - 100 нейронов, выходной - 15 нейронов. Активационная функция - сигмоид (1/(1+Exp(-Alpha*x)).

Проблема следующая: персептрон, после обучения, независимо от поданного образа выдает 1 только на том нейроне который был обучен последним. Другими словами - он запоминает только последний образ, а остальные забывает.

Пробовал менять v (скорость обучения), количество нейронов, случайные величины начальных весов и т.д. - одинакого.
Приложил класс с этим персептроном во вложении. (вложить нет прав пока).
http://zalil.ru/34189242

Перевел на C# пример, который предложили здесь Многослойный перспетрон в 6-ом посте.
вот собрал работающий проект:
http://zalil.ru/34189254

Тот же самый глюк. В чем косяк? поставьте на путь истинный)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2013, 14:18
Ответы с готовыми решениями:

Не запоминает линии, а только текст
Вот завёл хозяйство, помогите с домашней бухг, ЛистБокс не запоминает линии, а только в .ног текст, ЛИНИИ НАДО ... ...

Массив $url[0] запоминает только один символ
Массив $url должен хранить в себе ссылку "upload/photo0.jpg" Массив $url должен хранить в себе ссылку "upload/photo1.jpg" ...

Нейронные сети "Многослойный персептрон и алгоритм обратного распространения ошибки"
Помогите, пожалуйста! Очень и срочно нужно создать многослойную нейронную сеть и обучить для определенной задачи. Тема «Многослойный...

43
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 2
10.06.2017, 15:01
Студворк — интернет-сервис помощи студентам
Здравствуйте,RABBITSV! Я увлёкся нейросетями в последнее время, решил написать классификатор изображений mnist. Но он давал неправильные выходные данные. Я несколько раз переписывал его, изменяя всевозможные параметры сетки, и запутался окончательно. Можете, пожалуйста, проанализировать мой последний вариант, и сказать, что в нём не так?
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
226
227
228
229
230
231
232
233
using System;
using System.Drawing;
using System.IO;
using System.Xml;
using static System.Math;
 
enum MemoryMode { GET, SET }
enum NeuronType { Hidden, Output }
 
namespace NeuralNetwork
{
    class Network
    {
        double[][] answers =
        {
            new double[]{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            new double[]{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
            new double[]{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
            new double[]{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
            new double[]{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
            new double[]{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            new double[]{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
            new double[]{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
            new double[]{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
            new double[]{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        };
        public double[] fact = new double[10];
 
        public HiddenLayer hidden_layer = new HiddenLayer(20, 784);
        public OutputLayer output_layer = new OutputLayer(10, 20);
 
        static void Main(string[] args)
        {
            Network net = new Network();
            Bitmap bitmap;
            for (int k = 0; k < net.answers.Length; k++)
            {
                using (FileStream fs = File.OpenRead($"mnist_train{k}.jpg"))
                {
                    bitmap = new Bitmap(fs);
                }
                for (int j = 0; j < bitmap.Height / 28; j++)
                {
                    for (int i = 0; i < bitmap.Width / 28; i++)
                    {
                        InputLayer.GetInputArray(net, i, j, bitmap);
                        double[] errors = new double[net.answers.Length];
                        net.hidden_layer.Work(net);
                        net.output_layer.Work(net);
                        for (int x = 0; x < errors.Length; x++)
                            errors[x] = net.answers[k][x] - net.fact[x];
                        double[] temp_gsums = net.output_layer.BackwardPass(errors);
                        net.hidden_layer.BackwardPass(temp_gsums);
                    }
                }
            }
        }
    }
 
    class Neuron
    {
        public Neuron(double[] inputs, double[] weights, NeuronType type)
        {
            _type = type;
            _weights = weights;
            _inputs = inputs;
        }
        private NeuronType _type;
        private double[] _weights;
        private double[] _inputs;
        public double[] Weights { get => _weights; set => _weights = value; }
        public double[] Inputs { get => _inputs; set => _inputs = value; }
        public double Output { get => Activator(_inputs, _weights); }
        private double Activator(double[] i, double[] w)
        {
            double sum = 0;
            for (int l = 0; l < i.Length; l++)
                sum += i[l] * w[l];
            return Pow(1 + Exp(-sum), -1);
        }
        public double Derivativator(double outsignal) => outsignal * (1 - outsignal);
        public double Gradientor(double error, double dif, double g_sum) => (_type == NeuronType.Output) ? error * dif : g_sum * dif;
    }
 
    class InputLayer
    {
        public static void GetInputArray(Network net, int i, int j, Bitmap bitmap)
        {
            double[] array = new double[784];//784 == 28 * 28 (28x28 - image size)
            for (int m = 0; m < 28; m++)//28 - height
                for (int n = 0; n < 28; n++)//28 - width
                    array[n + 28 * m] = ((bitmap.GetPixel(n + 28 * i, m + 28 * j)).R + (bitmap.GetPixel(n + 28 * i, m + 28 * j)).G + (bitmap.GetPixel(n + 28 * i, m + 28 * j)).B) / 765.0d;//765 == 255 * 3 (255 - max value of color, 3 - color's count)
            net.hidden_layer.Data = array;
        }
    }
 
    abstract class Layer
    {
        Neuron[] _neurons;
        protected double[,] Weights;
        protected int numofneurons;
        protected int numofprevneurons;
        protected const double learningrate = 0.005d;
        public Neuron[] Neurons { get => _neurons; set => _neurons = value; }
        public double[] Data
        {
            set
            {
                for (int i = 0; i < Neurons.Length; i++)
                    Neurons[i].Inputs = value;
            }
        }
        abstract public double[,] WeightInitialize(MemoryMode mm);
        abstract public void Work(Network net);
    }
 
    class HiddenLayer : Layer
    {
        public HiddenLayer(int non, int nopn)
        {
            numofneurons = non;
            numofprevneurons = nopn;
            Neurons = new Neuron[non];
            Weights = WeightInitialize(MemoryMode.GET);
            for (int i = 0; i < non; i++)
            {
                double[] temp_weights = new double[nopn];
                for (int j = 0; j < nopn; j++)
                    temp_weights[j] = Weights[i, j];
                Neurons[i] = new Neuron(null, temp_weights, NeuronType.Hidden);
            }
        }
        public override void Work(Network net)
        {
            double[] hidden_out = new double[Neurons.Length];
            for (int i = 0; i < Neurons.Length; i++)
                hidden_out[i] = Neurons[i].Output;
            net.output_layer.Data = hidden_out;
        }
        public void BackwardPass(double[] gr_sum)
        {
            for (int i = 0; i < Weights.GetLength(0); i++)
                for (int n = 0; n < Weights.GetLength(1); n++)
                    Weights[i, n] = Neurons[i].Weights[n] += learningrate * Neurons[i].Inputs[n] * Neurons[i].Gradientor(0, Neurons[i].Derivativator(Neurons[i].Output), gr_sum[i]);
        }
        public override double[,] WeightInitialize(MemoryMode mm)
        {
            double[,] _weights = new double[numofneurons, numofprevneurons];
            Console.WriteLine("Hidden weights are being initialized...");
            XmlDocument memory_doc = new XmlDocument();
            memory_doc.Load("Hidden_Memory.xml");
            XmlElement memory_el = memory_doc.DocumentElement;
            switch (mm)
            {
                case MemoryMode.GET:
                    for (int l = 0; l < _weights.GetLength(0); l++)
                        for (int k = 0; k < _weights.GetLength(1); k++)
                            _weights[l, k] = double.Parse(memory_el.ChildNodes.Item(k + _weights.GetLength(1) * l).InnerText.Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture);
                    break;
                case MemoryMode.SET:
                    for (int l = 0; l < Weights.GetLength(0); l++)
                        for (int k = 0; k < Weights.GetLength(1); k++)
                            memory_el.ChildNodes.Item(k + Weights.GetLength(1) * l).InnerText = Weights[l, k].ToString();
                    break;
            }
            memory_doc.Save("Hidden_Memory.xml");
            Console.WriteLine("Hidden weights have been initialized...");
            return _weights;
        }
    }
 
    class OutputLayer : Layer
    {
        public OutputLayer(int non, int nopn)
        {
            numofneurons = non;
            numofprevneurons = nopn;
            Neurons = new Neuron[non];
            Weights = WeightInitialize(MemoryMode.GET);
            for (int i = 0; i < non; i++)
            {
                double[] temp_weights = new double[nopn];
                for (int j = 0; j < nopn; j++)
                    temp_weights[j] = Weights[i, j];
                Neurons[i] = new Neuron(null, temp_weights, NeuronType.Output);
            }
        }
        public override void Work(Network net)
        {
            for (int i = 0; i < Neurons.Length; i++)
                net.fact[i] = Neurons[i].Output;
        }
        public double[] BackwardPass(double[] errors)
        {
            double[] gr_sum = new double[numofprevneurons];
            for (int j = 0; j < gr_sum.Length; j++)
            {
                double sum = 0;
                for (int k = 0; k < Neurons.Length; k++)
                    sum += Weights[k, j] * Neurons[k].Gradientor(errors[k], Neurons[k].Derivativator(Neurons[k].Output), 0);
                gr_sum[j] = sum;
            }
            for (int i = 0; i < Weights.GetLength(0); i++)
                for (int n = 0; n < Weights.GetLength(1); n++)
                    Weights[i, n] = Neurons[i].Weights[n] += learningrate * Neurons[i].Inputs[n] * Neurons[i].Gradientor(errors[i], Neurons[i].Derivativator(Neurons[i].Output), 0);
            return gr_sum;
        }
        public override double[,] WeightInitialize(MemoryMode mm)
        {
            double[,] _weights = new double[numofneurons, numofprevneurons];
            Console.WriteLine("Output weights are being initialized...");
            XmlDocument memory_doc = new XmlDocument();
            memory_doc.Load("Output_Memory.xml");
            XmlElement memory_el = memory_doc.DocumentElement;
            switch (mm)
            {
                case MemoryMode.GET:
                    for (int l = 0; l < _weights.GetLength(0); l++)
                        for (int k = 0; k < _weights.GetLength(1); k++)
                            _weights[l, k] = double.Parse(memory_el.ChildNodes.Item(k + _weights.GetLength(1) * l).InnerText.Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture);
                    break;
                case MemoryMode.SET:
                    for (int l = 0; l < Weights.GetLength(0); l++)
                        for (int k = 0; k < Weights.GetLength(1); k++)
                            memory_el.ChildNodes.Item(k + Weights.GetLength(1) * l).InnerText = Weights[l, k].ToString();
                    break;
            }
            memory_doc.Save("Output_Memory.xml");
            Console.WriteLine("Output weights have been initialized...");
            return _weights;
        }
    }
}
0
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
10.06.2017, 23:10  [ТС]
Я извиняюсь, что пока не особо всматривался и не тестировал Ваш код, но возможно вы просто слишком мало обучаете сеть?
Вообще, что подразумевается под "неправильными выходными данными"? Значения на всех выходах близкие к нулям, к единицам или какие-то другие?
0
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 2
11.06.2017, 12:45
RABBITSV, спасибо большое, что откликнулись! Дело в том, что после обучения, во время проверки работы сети, она реагирует на все изображения одинаково, будто это 9. То есть, выходной вектор имеет приблизительный вид {0.01;0.01;0.01;0.01;0.01;0.01;0.01;0.01 ;0.01;0.91}. Так происходит и с изображениями для проверки, и с изображениями из обучающей выборки. Обучаю, подавая на вход, сначала единицы, потом двойки и так далее до девятки. Корректировка весов происходит после каждой итерации обучения.
0
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
11.06.2017, 16:38  [ТС]
Щас уже так просто не вспомню, в чём была причина, попробуйте подавать обучающие образы в случайном порядке (а не сначала 1 потом 2, .... 9).
Так же можете попробовать снизить скорость обучения (у вас это learningrate).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2017, 16:38

Как запустить Windows с жесткого диска, если есть только её образ
вобщем проблема такая: купил новый комп, скинул диск Д со старого харда на новый, на диске есть образ винды, платить 800руб за установку не...

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

Материаловедение. Двухслойный диэлектрик
Здравствуйте! В общем столкнулся с такой проблемой, учусь заочно, тему эту совсем не знаю, помогите люди добрые :3 Кто решит, свой номер...

Не могу записать двухслойный DVD.
Записывал Nero 7, она выдает http://imagepost.ru/?v=488/wTzQQiTWCVfMjX9z8hQO.jpg Пробывал другие проги, но они тоже не справились:wall:...

Отправляет только последний чекбокс
Добрый вечер. Не могу решить проблему с отправкой чекбоксов. Обратная отправляет только последний чекбокс. Уже двое суток ковыряюсь в php...


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

Или воспользуйтесь поиском по форуму:
44
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru