Нейронная сеть ведет себя странно после первой итерации - PullRequest
0 голосов
/ 25 апреля 2020

Я новичок в области нейронных сетей и просто прохожу свой первый настоящий рабочий образец, используя рукописный набор данных MNIST цифр. Я написал код, который, насколько мне кажется, должен работать (по крайней мере, до некоторого уровня), но я не могу понять, что заставляет его застрять сразу после прочтения первого учебного примера. Мой код выглядит следующим образом:

from keras.datasets import mnist
import numpy as np

def relu(x):
    return (x > 0) * x

def relu_deriv(x):
    return x > 0

(x_train, y_train), (x_test, y_test) = mnist.load_data();

images = x_train[0:1000].reshape(1000, 28*28)
labels = y_train[0:1000]

test_images = x_test[0:1000].reshape(1000, 28*28)
test_labels = y_test[0:1000]

# converting the labels to a matrix
one_hot_labels = np.zeros((len(labels),10))
for i,j in enumerate(labels):
    one_hot_labels[i][j] = 1
labels = one_hot_labels


alpha = 0.005
hidden_size = 5 # size of the hidden layer

# initial weight matrixes
w1 = .2 * np.random.random(size=[784, hidden_size]) - .1
w2 = .2 * np.random.random(size=[hidden_size, 10]) - .1

for iteration in range(1000):
    error = 0
    for i in range(len(images)):
        layer_0 = images[i:i+1]
        layer_1 = relu(np.dot(layer_0, w1))
        layer_2 = np.dot(layer_1, w2)
        delta_2 = (labels[i:i+1] - layer_2)
        error += np.sum((delta_2) ** 2)
        delta_1 = delta_2.dot(w2.T) * relu_deriv(layer_1)
        w2 += alpha * np.dot(layer_1.T, delta_2)
        w1 += alpha * np.dot(layer_0.T, delta_1)
    print("error: {0}".format(error))

То, что происходит на первой итерации, это, очевидно, большая ошибка, и после этого она исправляется до 1000, но затем, независимо от того, сколько еще итераций, она просто получает застрял на этом навсегда.

1 Ответ

1 голос
/ 25 апреля 2020

Вы не нормализовали данные изображения. Данные изображения имеют значение в диапазоне от 0 до 255. Из-за этих больших значений обновления весов становятся большими, что приводит к очень большим весам после первой итерации. Вы можете нормализовать данные изображения следующим образом.

images = x_train[0:1000].reshape(1000, 28*28)
images = images / 255
labels = y_train[0:1000]

test_images = x_test[0:1000].reshape(1000, 28*28)
test_images = test_images / 255
test_labels = y_test[0:1000]
...