Извините, если это глупый вопрос, но я просто не могу обернуться вокруг этого. Я пытаюсь создать свою первую нейронную сеть, которая берет данные 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
?
Большое спасибо за любую помощь!