пытаюсь сделать свою Нейросеть которая угадывает цифры 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