С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 26.05.2020
Сообщений: 3

В чем проблема моего алгоритма обратного распространения?

16.05.2023, 16:28. Показов 575. Ответов 1

Студворк — интернет-сервис помощи студентам
Написал небольшую нейронную сеть, которая должна распознавать цифры. Задача стоит в том чтобы это было на numpy.
Так вот, обучение происходит, веса меняются, но на выходе всегда преобладает один нейрон. Я думаю что ошибка в алгоритме обратного распространения. Делал все по формулам, но ошибка как таковой остается. Любые замечания приветствуются.

Алгоритм
Кликните здесь для просмотра всего текста

Python
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
                       #последний слой
                       if i == len(self.layerList) - 1:
                            
                            #проход по нейронам
                            for j in range(self.layerList[i].neuronList.shape[0]):
                                
                                subtracted_weight = learn_rate * self.layerList[i - 1].outputs * d_L_d_ypred[j] * self.deriv_sigmoid(y_pred[j])
                                self.layerList[i].change_weight(subtracted_weight, j)
                                
                                subtracted_b = learn_rate * d_L_d_ypred[j] * self.deriv_sigmoid(y_pred[j])
                                self.layerList[i].change_b(subtracted_b, j)
                                
                        
                        #скрытые слои
                        elif i != 0:
                            #проход по нейронам
                            for j in range(self.layerList[i].neuronList.shape[0]):
                                                                
                                #веса следующего слоя   
                                next_layer_weights = np.array(self.layerList[i+1].neuronList[:, j])
                         
                                d_th_list.append(np.dot(d_L_d_ypred * self.deriv_sigmoid(y_pred), next_layer_weights) * self.deriv_sigmoid(self.layerList[i].outputs[j]))
                                      
                                subtracted_weight = learn_rate * self.layerList[i - 1].outputs * d_th_list[j]
                                self.layerList[i].change_weight(subtracted_weight, j)
                                
                                subtracted_b = learn_rate * d_th_list[j]
                                self.layerList[i].change_b(subtracted_b, j)
                        
                        #входной слой
                        else:
                            for j in range(self.layerList[i].neuronList.shape[0]):
                                
                                #веса следующего слоя
                                next_layer_weights = np.array(self.layerList[i+1].neuronList[:, j])
                                
                                
                                subtracted_weight = learn_rate * input_data * np.dot(next_layer_weights, d_th_list) * self.deriv_sigmoid(self.layerList[i].outputs[j])
                                self.layerList[i].change_weight(subtracted_weight, j)
                                
                                subtracted_b = learn_rate * np.dot(next_layer_weights, d_th_list) * self.deriv_sigmoid(self.layerList[i].outputs[j])
                                self.layerList[i].change_b(subtracted_b, j)



Весь код:
Кликните здесь для просмотра всего текста

Python
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
import numpy as np
from keras.datasets import mnist
import matplotlib.pyplot as plt
 
(train_X, train_y), (test_X, test_y) = mnist.load_data()
 
SIZE = train_X.shape[1]     # высота картинки
 
# линеаризируем входные данные
train_X = train_X.reshape(-1, SIZE*SIZE)
test_X = test_X.reshape(-1, SIZE*SIZE)
 
# масштабируем данные, чтобы значения лежали между 0 и 1:
train_X = train_X / 255
test_X = test_X / 255
 
class Layer:
    def __init__(self, neuron_number, weight_number):
        self.neuronList = np.random.sample((neuron_number, weight_number))
        self.b = np.random.sample(neuron_number)
    
    
    def sigmoid(self, s, alpha=0.1):
        return 1 / (1 + np.exp(-alpha*s))
    
    def change_weight(self, subtracted_weight, neuron_number):
        self.neuronList[neuron_number] -= subtracted_weight
    
    def change_b(self, subtracted_b, b_number):
        self.b[b_number] -= subtracted_b
    
    def feedForward(self, input_data, neuron_number):
        s = np.dot(self.neuronList[neuron_number], input_data) + self.b[neuron_number]
        return self.sigmoid(s)
    
    
    def layerOutPuts(self, data): 
        length = self.neuronList.shape[0]
        self.outputs = np.zeros(length)
        for i in range(length):
            self.outputs[i] = self.feedForward(data, i)
        
 
class Network:
    def __init__(self, network_data):
        self.layerList = []
        for i in range(1, len(network_data)):
            neuron_number = network_data[i]
            weight_number = network_data[i - 1]
            self.layerList.append(Layer(neuron_number, weight_number))
            
    
    def deriv_sigmoid(self, y):
        return y * (1 - y)
    
    
    def trueDataConvert(self, a):
        y_true_convert = [
            [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
        ]
        return y_true_convert[a]
    
    
    def answer(self, input_datas, y_trues):
        
        for input_data, y_true in zip(input_datas, y_trues):
                
            
            for i in range(len(self.layerList)):
                
                if i == 0:
                    self.layerList[i].layerOutPuts(input_data)
                
                else:
                    self.layerList[i].layerOutPuts(self.layerList[i-1].outputs)
                    
                        
                        
            y_pred = self.layerList[len(self.layerList) - 1].outputs
                  
            print('Ответ: ', np.argmax(y_pred))
            
            print('Правильный ответ: ',y_true)
        
            
            
    
    #обучение
    def fit(self, input_datas, y_trues):
        
        learn_rate = 0.1
        epochs = 3 
        
        
        for epoch in range(epochs):
            loses = []
            
            print()
            
            for input_data, y_true in zip(input_datas, y_trues):
           
                y_true = np.array(self.trueDataConvert(y_true))
                
                #данные идут на вход
                for i in range(len(self.layerList)):
                    #первый слой
                    if i == 0:
                        self.layerList[i].layerOutPuts(input_data)
                    
                    #оcтальные слой
                    else:
                        self.layerList[i].layerOutPuts(self.layerList[i-1].outputs)
                    
                #выходы нейросети
                
                y_pred = self.layerList[len(self.layerList) - 1].outputs
                
                d_L_d_ypred = 2/10 * (y_pred - y_true)
                  
                #потери
                loses = np.append(loses, ((y_true - y_pred) ** 2).mean())
                
                d_th_list= [] #tetha скрытого слоя
                
                
                #обратный проход
                for i in range(len(self.layerList) - 1, -1, -1):
                        
                        #последний слой
                        if i == len(self.layerList) - 1:
                            
                            #проход по нейронам
                            for j in range(self.layerList[i].neuronList.shape[0]):
                                
                                subtracted_weight = learn_rate * self.layerList[i - 1].outputs * d_L_d_ypred[j] * self.deriv_sigmoid(y_pred[j])
                                self.layerList[i].change_weight(subtracted_weight, j)
                                
                                subtracted_b = learn_rate * d_L_d_ypred[j] * self.deriv_sigmoid(y_pred[j])
                                self.layerList[i].change_b(subtracted_b, j)
                                
                        
                        #скрытые слои
                        elif i != 0:
                            #проход по нейронам
                            for j in range(self.layerList[i].neuronList.shape[0]):
                                                                
                                #веса следующего слоя   
                                next_layer_weights = np.array(self.layerList[i+1].neuronList[:, j])
                         
                                d_th_list.append(np.dot(d_L_d_ypred * self.deriv_sigmoid(y_pred), next_layer_weights) * self.deriv_sigmoid(self.layerList[i].outputs[j]))
                                      
                                subtracted_weight = learn_rate * self.layerList[i - 1].outputs * d_th_list[j]
                                self.layerList[i].change_weight(subtracted_weight, j)
                                
                                subtracted_b = learn_rate * d_th_list[j]
                                self.layerList[i].change_b(subtracted_b, j)
                        
                        #входной слой
                        else:
                            for j in range(self.layerList[i].neuronList.shape[0]):
                                
                                #веса следующего слоя
                                next_layer_weights = np.array(self.layerList[i+1].neuronList[:, j])
                                
                                
                                subtracted_weight = learn_rate * input_data * np.dot(next_layer_weights, d_th_list) * self.deriv_sigmoid(self.layerList[i].outputs[j])
                                self.layerList[i].change_weight(subtracted_weight, j)
                                
                                subtracted_b = learn_rate * np.dot(next_layer_weights, d_th_list) * self.deriv_sigmoid(self.layerList[i].outputs[j])
                                self.layerList[i].change_b(subtracted_b, j)
            
            #построение графика потерь
            x = range(100)
            plt.grid(True)
            plt.plot(x, 
                    loses, 
                    'bo-', 
                    label='Train losses')
 
            plt.xlabel('Epoch')
            plt.ylabel('Loss')
 
            plt.legend(loc='upper right')                   
 
#задаем нейросеть в 3 слоя
 
network_data = [784, 32, 16, 10]               
 
nt = Network(network_data)
 
new_train_x = train_X[:100]
new_train_y = train_y[:100]
 
 
nt.fit(new_train_x, new_train_y)
 
#nt.answer(new_train_x, new_train_y)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2023, 16:28
Ответы с готовыми решениями:

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

В чем проблема моего кода?
#include <iostream> #include <math.h> using namespace std; int main() { const int m = 5 , k = 30; int n , i , j, cnt =...

Нейросеть обратного распространения
Здравствуйте!) С нейросетями познакомилась недавно... Есть задание: Реализовать алгоритм обучения нейросети методом обратного...

1
0 / 0 / 0
Регистрация: 26.05.2020
Сообщений: 3
18.05.2023, 22:36  [ТС]
Изменил способ инициализации параметров так, чтобы изначально были как положительные, так и отрицательные веса. В вашем методе все параметры были положительными. В итоге это привело к тому, что теперь сеть обучается исправно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2023, 22:36
Помогаю со студенческими работами здесь

Метод обратного распространения
В чем собственно проблема? В качестве эксперимента решил потестить очень упрощенную модель нейросети, где есть всего один входной...

Метод обратного распространения ошибки
Добрый день. Есть ли у кого-то код по данному методу написанному в Matlab? т.к. сам не могу разобраться в этой теме

Нейронная сеть обратного распространения
Здравствуйте. Начал на днх изучать нейронные сети и хочу сделать простую нейронку. 3 входных слоя - 6 скрытых слоев - 3 выходных слоя. Для...

Алгоритм обратного распространения ошибки
Добрый вечер! Написал код для Алгоритм обратного распространения ошибки, но видимо где-то накосячил и код не работает верно, подскажите...

Нейронные сети обратного распространения
Здравствуйте. Пытаюсь обучить сеть таблице умножения. Обучает до 1*3, а дальше не получается у него. Подскажите в чем беда. class...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru