Python 3.x Softmax的导数输出非常大的形状

Python 3.x Softmax的导数输出非常大的形状,python-3.x,neural-network,backpropagation,softmax,Python 3.x,Neural Network,Backpropagation,Softmax,我正在创建一个基本的,也是我的第一个手写数字识别神经网络,没有任何框架,如Tensorflow,PyTorch。。。使用反向传播算法 我的NN有784个输入和10个输出。所以对于最后一层,我必须使用Softmax 由于一些记忆错误,我现在的图像是300,784形状,标签是300,10形状 之后,我根据分类交叉熵计算损失。 现在我们开始解决我的问题。在反向传播中,我需要手动计算激活函数的一阶导数。我是这样做的: dAl = -(np.divide(Y, Al) - np.divide(1 - Y,

我正在创建一个基本的,也是我的第一个手写数字识别神经网络,没有任何框架,如Tensorflow,PyTorch。。。使用反向传播算法

我的NN有784个输入和10个输出。所以对于最后一层,我必须使用Softmax

由于一些记忆错误,我现在的图像是300,784形状,标签是300,10形状 之后,我根据分类交叉熵计算损失。 现在我们开始解决我的问题。在反向传播中,我需要手动计算激活函数的一阶导数。我是这样做的:

dAl = -(np.divide(Y, Al) - np.divide(1 - Y, 1 - Al))
#Y = test labels
#Al - Activation value from my last layer
然后我可以开始反向传播,最后一层是softmax

def SoftmaxDerivative(dA, Z):
        #Z is an output from np.dot(A_prev, W) + b
              #Where A_prev is an activation value from previous layer
              #W is weight and b is bias
        #dA is the derivative of an activation function value
        x = activation_functions.softmax(dA)
        s = x.reshape(-1,1)
        dZ = np.diagflat(s) - np.dot(s, s.T)
        return dZ
一,。此功能是否正常工作

最后,我想计算权重和偏差的导数,所以我使用以下公式:

dW = (1/m)*np.dot(dZ, A_prev.T)
#m is A_prev.shape[1] -> 10
db = (1/m)*np.sum(dZ, axis = 1, keepdims = True)
但是它在dW上失败了,因为dZ.shape是3000,与A_prev.shape相比是3000,10 因此,我假设,只有3种可能的结果

我的Softmax后退错误

dW是错误的

我在别的地方完全有别的臭虫


任何帮助都将不胜感激

我最近也遇到了同样的问题。我不确定,但这个问题可能会对你有所帮助:

嘿-在处理形状问题或寻求帮助时,添加所有涉及的张量的维数总是很有用的:。两个小的观察结果1您的一阶导数似乎没有检查0次除法,2您的SoftmaxDerivative根本不使用Z输入。假设dA.shape=300,10,正确的输出形状应为300300。。所以,也许你在某个地方乘以dA.shape=3000,在某个地方乘以10…?谢谢,这确实帮了我的忙