Форум программистов, компьютерный форум, киберфорум
Konst2016
Войти
Регистрация
Восстановить пароль

Крутой код.Самодельная нейросеть работает с mnist

Запись от Konst2016 размещена 10.10.2019 в 16:51
Показов 4832 Комментарии 16

Здравствуйте!Показываю код как нейросеть с 784 входами и 40 нейронами скрытого слоя и 10 нейронами выхода обучается на наборе mnist-черно-белых картинок рукописных цифр.
В коде происходит нормализация неактивированного состояния нейрона и после его активации(так на двух слоях),без этого в системе накапливались больше числа,и MSE выдавала как nan.Соответственно подправлен backprop(градиенты).
Код
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
"""
   Трехслойный перпецетрон
"""
 
import numpy as np
import matplotlib.pyplot as plt
 
from math import sqrt
from keras.datasets import mnist
 
from keras.utils import np_utils
 
import hashlib as hsh
 
#np.set_printoptions(threshold=np.inf) для вывода матриц полностью
 
 
 
# Зерно для генератора
np.random.seed(42)
 
bias_val=1
class NN:
 
  def nonlin(self,sygnals,deriv=False):
    
     if deriv:
           return (sygnals*(1.0-sygnals))
 
     return (1.0 / (1+np.exp(-sygnals)))
   
  def __init__(self):
 
     self.e1=None # Взвешенная сумма сигналов на первой прослойке
     self.e2=None # Взвешенная сумма сигналов на второй прослойке 
   
     self.hidden1=None # активированное состояние нейронов на первой прослойке
     self.hidden2=None # активированное состояние нейронов на второй прослойке
 
     self.learning_rate=0.001   
  
     self.init_net()
  
  def  init_net(self):
    
   
     self.in_layer1=np.random.normal(0,2**-0.5,(40,784)) 
     self.in_layer2=np.random.normal(0,2**-0.5,(10,40))
     # Говорят так лучше инициализировать веса,под дробью параметр-количество
     # дендритов-сигналов
     #self.in_layer1=np.random.randn(40,784)\
       #*sqrt(2.0/784)
     #self.in_layer2=np.random.randn(10,40)\
       #*sqrt(2.0/10)
     print("lay1 %s \n lay2 %s"%(self.show_matrix_hash(self.in_layer1,self.in_layer2)[0],self.show_matrix_hash(self.in_layer1,self.in_layer2)[1]))
     
    
  def direct_motion(self,_vector):
 
      
     self.e1=np.dot(self.in_layer1,_vector.T)
     self.e1/=784
    
     self.hidden1=self.nonlin(self.e1
                              +bias_val
                              )
     self.hidden1/=784 # Здесь все нормализовал что бы не было больших чисел
                       # ведь идет сумма произведений,которые близки к единицы
                       # а их 784
     self.e2=np.dot(self.in_layer2,self.hidden1)
     self.e2/=40      # нормализовал
     self.hidden2=self.nonlin(self.e2
                              +bias_val
                              )
     self.hidden2/=40
     return self.hidden2
 
   # for debug
  def show_matrix_hash(self,*matr):
                hash_obj=hsh.sha256()
                matr_list=['']*len(matr)
                j=0
                #:matrix<R> 
                for i  \
                    in matr:   
                         hash_obj.update(str(matr).encode('ascii'))
                         matr_list[j]=hash_obj.hexdigest()
                         j+=1
                return matr_list      
 
  
  def calculate_minimal_square_error(self,val):
 
     return np.mean(np.square(val))
   
 
  def back_propagate(self,vector, target):
  
      """
         Прямой проход
      """
      out_NN=self.direct_motion(vector)
      #print("out %s",self.show_matrix_hash(out_NN)[0])
 
      """
           Расчет ошибки 
      """
      delta_out=abs(target.T-out_NN)
      grads_out_nn=delta_out*self.nonlin(self.e2,deriv=True)
     
 
      grads_on_lay2=np.dot(grads_out_nn.T,self.in_layer2)*self.nonlin(self.e1.T,deriv=True)*1/40 # Подправлям дифференциалы
      grads_on_lay1=np.dot(grads_on_lay2,self.in_layer1)*1/784  # Подправлям дифференциалы
 
      """
         Коррекция ошибки
      """
     
      self.in_layer1+=(vector*grads_on_lay1*self.learning_rate)
     
      self.in_layer2+=(self.e1.T*grads_on_lay2*self.learning_rate)
 
      return self.calculate_minimal_square_error(delta_out)
    
  def plot_graphic_by_x_and_y(self,x,y):
      plt.plot(x,y)
      plt.show()    
 
  def learn(self,epocha:int,l_r:float,train_set,target_set):
    
     error=0.0
     self.learning_rate=l_r
     iteration:int=0
     n_epochs=[]
     n_mse=[]
     while(iteration< epocha):
       
       for i in range(train_set.shape[0]):
           
            single_2D_array_train=np.array([train_set[i]])
            single_2D_array_target=np.array([target_set[i]])
            error=self.back_propagate(single_2D_array_train,single_2D_array_target)
       if iteration % 1==0:
 
          print(error)
          n_epochs.append(iteration)
          n_mse.append(error)
           
 
       iteration+=1
     self.plot_graphic_by_x_and_y(n_epochs,n_mse)
     
 
def create_nn()->NN:
 
  return NN()     
def test():
   (X_train,y_train),(X_test,y_test)=mnist.load_data()
   
   X_train=X_train.astype('float32')
    
  
   X_train=X_train.reshape(60000,784)
  
   # Нормализация всей обучающей выборки
   X_train=X_train/255.0
   print('X_train',X_train[0])
   
   y_train=np_utils.to_categorical(y_train)    
 
   NN=create_nn()  
 
   NN.learn(100,0.7,X_train,y_train)  
#===========================
if __name__=='__main__':
   test()
#===========================
График
Нажмите на изображение для увеличения
Название: right_mse_mnist.png
Просмотров: 3150
Размер:	19.1 Кб
ID:	5612
Спасибо!До свидания!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 16
Комментарии
  1. Старый комментарий
    100…7
    График чего? Где легенда на графике( подписи к осям). Для мнист указана там на сайте выборка и процент ошибки. Там спец кусок данных берут.
    Запись от Excalibur921 размещена 10.10.2019 в 18:59 Excalibur921 вне форума
  2. Старый комментарий
    Вообще то да,графики я пока неважно освоил,все думал над backprop,C,Java коды изучал.
    Запись от Konst2016 размещена 10.10.2019 в 19:28 Konst2016 вне форума
  3. Старый комментарий
    Цитата Сообщение от Excalibur921
    Для мнист указана там на сайте выборка и процент ошибки.
    При таком размере сети - товарищ ниже 3% ошибок на тестовой выборке не опустится.
    Насколько же у него может быть выше - ХЗ, ибо мне лень посмотреть, что может быть при необучаемых бивисах.
    Т.е. никакого интереса % ошибок пока в принципе не представляет. Ибо и сетка мелкая, и слишком много костылей/неоптимальностей.
    Запись от VTsaregorodtsev размещена 15.10.2019 в 16:57 VTsaregorodtsev на форуме
  4. Старый комментарий
    нейросеть с 784 входами и 40 нейронами скрытого слоя и 10 нейронами выхода обучается на наборе mnist-черно-белых картинок рукописных цифр.
    ок. какой текст эта нейросеть может распознать? где картинки с опытными образцами и результатами распознавания?
    Запись от untyped размещена 15.10.2019 в 17:34 untyped вне форума
  5. Старый комментарий
    Этого всего я пока не успел.Просто анлоязычные прогеры тоже пытались сделать свою сеть для mnist,но ничего не получилось,потому что обучение вообще не шло,mse был nan,так как накапливались большие числа,я пытался нормализовать
    в feed_forward и обучение прошло.
    Запись от Konst2016 размещена 15.10.2019 в 23:54 Konst2016 вне форума
  6. Старый комментарий
    Цитата Сообщение от Konst2016
    mse был nan
    Задолго до того, как MSE станет NAN, должно произойти переполнение результата у exp().
    Т.е. если траблема ловится именно на шаге вычисления MSE - это не значит, что прочая математика до MSE посчиталась правильно
    Запись от VTsaregorodtsev размещена 16.10.2019 в 10:55 VTsaregorodtsev на форуме
  7. Старый комментарий
    А,Виктор!)Я вам email писал.Я и говорю в Mse ведь нет exp(),если в feed_forward не нормализовать ничего не получится.
    Запись от Konst2016 размещена 16.10.2019 в 14:38 Konst2016 вне форума
  8. Старый комментарий
    Аватар для bedvit
    Ждем результатов распознавания текста.
    Запись от bedvit размещена 16.10.2019 в 16:33 bedvit вне форума
  9. Старый комментарий
    Кто то подменил авторство статьи,подписал мое авторство в моем блоге.Если что то не нравится пиши в комментах,так разберемся,а он ломает.
    Запись от Konst2016 размещена 26.11.2019 в 05:47 Konst2016 вне форума
  10. Старый комментарий
    Аватар для bedvit
    Цитата Сообщение от Konst2016
    Здесь есть парень bedvit.
    Да он здесь (если вы про меня). Ничего я у вас не трогал. И да, давайте разберемся, потому как я ничего не понял из вашего сообщения, что и где я у вас сломал и где стал автором в вашем блоге.
    Запись от bedvit размещена 26.11.2019 в 08:40 bedvit вне форума
  11. Старый комментарий
    Да я не подумал,что это может быть кто другой,вот такую 'картину' вижу.Извиняюсь раз не вы.Там Вк есть скрин: https://vk.com/public187274160
    Запись от Konst2016 размещена 26.11.2019 в 18:23 Konst2016 вне форума
  12. Старый комментарий
    Кто то подменил авторство статьи,подписал мое авторство в моем блоге.
    не осиляю этот бред.
    Там Вк есть скрин: https://vk.com/public187274160
    что это? попытка привлечь внимания и популярности к своему посредственному блогу в ВК?
    Запись от untyped размещена 26.11.2019 в 19:54 untyped вне форума
  13. Старый комментарий
    Аватар для bedvit
    Извенения принимаю, но так и не понял в чем замес. Зашёл посмотреть на скрин, а там группа в контакте. Реклама вашей группы?
    Запись от bedvit размещена 27.11.2019 в 02:49 bedvit вне форума
  14. Старый комментарий
    Да нет,там в списках названиях моих постов в названии "Крутой код.Самодельная нейросеть работает с mnist" вместо меня автора Konst2016 стоит 'bedvit',кто-то делал SQL иньекции и ставил на мое авторство других людей,хотя это маленькая колонка,но неприятно.Еще раз извиняюсь ,что не разобрался.
    Запись от Konst2016 размещена 28.11.2019 в 09:30 Konst2016 вне форума
  15. Старый комментарий
    какая sql-инъекция? что за бред?
    В той колонке показывает автора последнего комментария
    Запись от untyped размещена 28.11.2019 в 11:05 untyped вне форума
  16. Старый комментарий
    Да ну?)Вроде действительно автора последнего комментария.Спасибо.Перед всеми извиняюсь(просто не догадался)Просто наслушаешься историй про вредных хакерах и т.д.
    Запись от Konst2016 размещена 28.11.2019 в 11:50 Konst2016 вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru