Понимание обратного распространения с softmax - PullRequest
1 голос
/ 19 октября 2019

Извините, если это глупый вопрос, но я просто не могу обернуться вокруг этого. Я пытаюсь создать свою первую нейронную сеть, которая берет данные MNIST (28x28), на которых нарисованы от руки цифры 0-9, и выводит, какие нейронные сети думают, что это так. В последнем слое мне нужно сделать функцию softmax, которая может выводить все вероятности этих чисел, которые затем суммируют до 1.

def softmax(z):
    exps = np.exp(z - z.max())

    return exps/np.sum(exps), z

К этому моменту все должно быть хорошо. Но теперь мы переходим к части обратного распространения => Я обнаружил в Интернете эту функцию softmax для обратного распространения.

def softmax_backward(dA, Z):
    x, _ =softmax(dA)
    s=x.reshape(-1,1)

    return (np.diagflat(s) - np.dot(s, s.T))

Вопрос 1. Подходит ли эта производная функция softmax для моего NN?

Если это подходит, то у меня ошибка где-то еще. Это моя ошибка:

--------------------------------------------------------------------------- ValueError                                Traceback (most recent call
last) <ipython-input-21-b0721d5dd18f> in <module>
---> 26 parameters = model(x_testone, y_testone, layer_dims)

<ipython-input-20-0653ba2ad7e6> in model(X, y, layer_dims,
learning_rate, epochs, print_cots, activation)
     10         zCache = zCaches[l+1]
     11 
---> 12         grads = L_model_backward(Al, y, linCaches, zCaches, activation)
     13 
     14         parameters = update_parameters(parameters, grads, learning_rate)

<ipython-input-18-8b76528a319a> in L_model_backward(Al, y, linCaches,
zCaches, activation)
---> 11     grads["dA" + str(L-1)], grads["dW" + str(L)], grads["db" + str(L)] = liner_activ_backward(dAl, zCaches[L-1], linCaches[L-1],
"softmax")
     12 

<ipython-input-17-6e9b3ba31571> in liner_activ_backward(dA, zCache,
linCache, activation)
     20         dZ = softmax_backward(dA, Z)
---> 21         dA_prev, dW, db = linear_backward(dZ, linCache)
     22         return dA_prev, dW, db
     23 

<ipython-input-16-4b15b65d0522> in linear_backward(dZ, linCache)
----> 7     dW = (1/m) * np.dot(dZ, A_prev.T)
      8     db = (1/m) * np.sum(dZ, axis=1, keepdims=True)
      9     dA_prev = np.dot(W.T, dZ)

ValueError: shapes (10000,10000) and (20,1000) not aligned: 10000 (dim
1) != 20 (dim 0) ```

Теперь я думаю, что моя ошибка в методе liner_backward, потому что он не совместим с softmax. Я прав с этим или совершенно не прав?

Вопрос 2: Какой метод я должен использовать вместо метода linear_backward?

Большое спасибо за любую помощь!

...