Dimpik
@Dimpik

Почему моя нейросеть по распознованию цифр MNIST не работает?

пытаюсь сделать свою Нейросеть которая угадывает цифры MNIST. Я пишу на Python, используя 1 скрытый (128 нейронов) слой, Softmax, Relu. Сначала я попытался написать его без библиотек. Он работал, но учился медленно, а у меня нет 10 часов на его обучение. Затем я добавляю Numpy. Ничего не работает. У меня огромные числа на выходе и как следствие Math Range Error(Числа на подобие 2.74512381e+10). Изменение скорости обучения не влияет на ошибку.

В части кода с предсказанием я уверен на все 100, поэтому вот код обучения:
def Education(): # f() обучения
	global par
	for i in range(15):
		sumOfErrs = 0
		trLen = len(x_train)
		for a in range(trLen):
			it = normalize(x_train[a])
			array = nn.NeuralNetwork(par.weights_0_1, par.weights_1_2, par.biases1, par.biases2, it)
			predN = array[0] # Выход с учетом Softmax
			pred = array[1] # Выход без учета Softmax
			Layer1 = array[2] # Скрытый слой
			goalclasspred = predN[y_train[a]] # Значение выхода для верного класса
			par.error = math.log(goalclasspred)*(-1)
			w1_2Len = len(par.weights_1_2)
			for k in range(w1_2Len):
				layer_1_deltas = np.array([fa.CrossEntropyDeriv(goalclasspred) for i in range(w1_2Len)])
				if k == y_train[a]:
					layer_1_deltas[k] *= goalclasspred*(1-goalclasspred)
				else:
					layer_1_deltas[k] *= (-1)*goalclasspred*predN[k]
			
			print(layer_1_deltas)
			layer_0_deltas = np.zeros((10, 128))
			layer_0_deltas = np.dot(par.weights_1_2.T, layer_1_deltas)*fa.ReLUDeriv(Layer1)
			par.weights_1_2 = par.weights_1_2 - np.outer(layer_1_deltas*par.alpha, Layer1)
			par.biases2 = par.biases2 - layer_1_deltas*par.alpha
			
			delta_alfa1 = [num * par.alpha for num in layer_0_deltas]
			par.weights_0_1 = par.weights_0_1 - np.outer(layer_0_deltas*par.alpha, it)
			par.biases1 = par.biases1 - layer_0_deltas*par.alpha
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Несколько соображений. Я думаю что для решения MNIST задач никакие огромные числа не нужны.
НС идеологически способны работать на малом диапазоне плавающей точки. И функции активации
(если таковые есть) обычно этому способствуют.

Numpy в данном случае имеет преимущество вовсе не в больших числах а в операциях над векторами и матрицами.

С твоей ситуацией низкого перформанса никто разбираться не будет. Нет ошибки - и нет ответа.
Если медленная скорость - ищи гиперпараметр η (греческая буква) - он регулирует скоросить.
алгортмов обратного распространения ошибки. (В разной литературе он может и по другому называться)

Учись по курсам. Потому что учить тебя нейросетям здесь бесплатно точно никто не будет. И это
технически невозможно в формате ответов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы