Мой код Python для набора данных MNIST показывает гигантские значения ошибок, чего мне не хватает? - PullRequest
0 голосов
/ 02 мая 2019

Ниже вы можете найти мой код, который является моим первым серьезным кодом для обучения машинному обучению и Python.Я пытался написать код с нуля, не используя такие библиотеки, как NumPy.Для одиночного ввода и вывода код работает, но когда дело доходит до реальных наборов данных (которые в данном случае представляют собой 784 входа на 10 выходов), он возвращает бесконечность как ошибку.Я проверил все, что я думал, что может быть проблемой без успеха.

Код может быть грязным решением.Я начал с кода с изучения Trask Github и его кода для нескольких работ ввода / вывода, но когда я изменил его, чтобы использовать MNIST, все становится сумасшедшим.Может ли кто-нибудь взглянуть и помочь мне узнать, что мне не хватает и в чем проблема (ы)?Ценится.

for i in range (x_train.shape[0]):
    x_labels[i,x_label[i]]=1
def w_sum(a,b):
    assert(len(a) == len(b))
    output = 0
    for i in range(len(a)):
        output += (a[i] * b[i])
    return output

def neural_network(input1, weights):
    pred = vect_mat_mul(input1,weights)
    return pred

def vect_mat_mul(vect,matrix):
    output = np.zeros(10)
    for i in range(10):

        output[i] = w_sum(vect[0],matrix[:,i])

    return output
def outer_prod(a, b):
    out = np.zeros((len(a), len(b)))
    for i in range(len(a)):
        for j in range(len(b)):
            out[i][j] = a[i] * b[j]
    return out

(x_train,x_label),(t_test,t_label)=ks.datasets.mnist.load_data()
x_train=x_train.reshape(x_train.shape[0],28*28)
weights=np.random.rand(784,10)
x_labels=np.zeros((x_train.shape[0],10))
alpha = 0.00001

for i in range(x_train.shape[0]):
    error = np.zeros(10)
    delta = np.zeros(10)
    for iter in range(50):
        x_train_to_NN = np.array([x_train[i]])
        pred = neural_network(x_train_to_NN, weights)
        for j in range(10):
            error[j] = (pred[j] - x_labels[i, j]) ** 2
            delta[j] = pred[j] - x_labels[i, j]
        weight_deltas = outer_prod(x_train[i], delta) #calculate the gradient
        for idx in range(784):
            for jdx in range(10):
                weights[idx][jdx] -= alpha * weight_deltas[idx][jdx] #update weight matrix

print('key=', i, '\n Error=', error, '\n Delta=', delta, '\n Prediction=', pred)

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Я наконец-то нашел ответ, и это « Градиентная отсечка ». Дело в том, что при расчете градиента его необходимо ограничить (нормализовать), чтобы избежать взрыва градиента.

0 голосов
/ 02 мая 2019

Я вижу много ошибок здесь.Одно из главных преимуществ использования NN-библиотек, таких как tenorflow, pyTorch и т. Д., Заключается в том, что они позаботятся о красивых, но при этом изящных линейных частях алгебры.Например, все веса нейронной сети инициализируются особым образом, чтобы они не были ни больше 1, ни намного меньше 1, иначе градиенты исчезают или взрываются слишком быстро.Кроме того, неясно, где вы вычисляете свои градиенты, обновляете функцию стоимости и т. Д. Чтобы вычислить градиенты, вам нужно перейти в пространство журнала и вернуться, чтобы вы снова избежали ошибки с плавающей запятой, которая приведет к взрыву градиента (таким образом,ошибка бесконечности).:) Я бы посоветовал вам лучше взглянуть на теоретическую часть, а затем попытаться реализовать каждую часть отдельно.Cheers,

...