很抱歉,这是一个愚蠢的问题,但是我无法解决这个问题。 我正在尝试创建我的第一个神经网络,该网络将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
方法?
非常感谢您的帮助!