我正在实现一个多类神经网络,它将从输入图像中识别数字。输入图像是5×5像素,显示5个数字。因此,神经网络模型包含25个输入节点。4个输出节点(因为我们必须对5个输出进行分类)和50个隐藏节点。我使用sigmoid函数作为隐藏节点的激活函数,并使用softmax函数作为输出节点的激活函数。
我的输入参数X包含堆叠的二维图像数据,即5*5*5个三维矩阵。因此,我使用np.reshape(X:,:,x,25)将其转换为(25,)向量,以便可以轻松地获得加权和(因为输入到隐藏节点的权重为25*50,而隐藏到输出节点的权重为50*5 )。
我面临的问题是,当我分别计算输入到隐藏和隐藏到输出的增量时,我得到了值错误“ValueError: shapes ( 50,) (5,5) :50 (dim 0) != 5 (dim 0)",我完全理解这是因为这两个数组的维数。但我无法找出解决方案,所以我可以用某种方式重塑它们,并采用点积。因为我是第一次学习python和这些神经网络的东西,并编写自己的代码,所以我在处理矩阵方面没有太多的专业知识。我需要一些帮助,1)修复这个问题,2)我如何改进这个网络(未来的实践)。3)我如何才能使网络泛型,这样如果我可以添加更多的层等,我就不会搞乱不同维数的矩阵乘法?下面是代码的原型。
代码
# other stuff
def function(W1, W2, X, D):
N = 5
for x in range(N):
# reshaping input in 25*1 vector
l0 = np.reshape(X[:,:,x],25)
ll = sigmoid(np.dot(l0,W1))
l2 = softmax(np.dot(ll,W2))
l2_error = D - l2
l2_delta = l2_error
l1_error = l2_delta.dot(W2.T)
l1_delta = ll*(1-ll)*l1_error
DW2 = alpha*ll.T.dot(l2_delta) #ValueError: shapes (50,) and (5,5) not aligned: 50 (dim 0) != 5 (dim 0)
W2 = W2 + DW2
DW1 = alpha*l0.T.dot(l1_delta) #ValueError: shapes (25,) and (5,50) not aligned: 25 (dim 0) != 5 (dim 0)
W1 = W1 + DW1
# other stuff
X = np.zeros((5,5,5), dtype=int)
D = np.zeros((5,5), dtype=int)
X[:,:,0] = [[0 ,1, 1, 0, 0],
[0 ,0, 1, 0, 0],
[0 ,0, 1, 0, 0],
[0 ,0, 1, 0, 0],
[0 ,1, 1, 1, 0]]
X[:,:,1] = [[1 ,1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[0 ,1, 1, 1, 0],
[1 ,0, 0, 0, 0],
[1 ,1, 1, 1, 1]]
X[:,:,2] = [[1 ,1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[0 ,1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[1 ,1, 1, 1, 0]]
X[:,:,3] = [[0 ,0, 0, 1, 0],
[0 ,0, 1, 1, 0],
[0 ,1, 0, 1, 0],
[1 ,1, 1, 1, 1],
[0 ,0, 0, 1, 0]]
X[:,:,4] = [[1 ,1, 1, 1, 1],
[1 ,0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[1 ,1, 1, 1, 0]]
D = np.array([ [1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1] ]).T
W1 = 2*np.random.random((25,50)) - 1
W2 = 2*np.random.random((50,5)) - 1
W1, W2 = Multiclass(W1, W2, X, D)https://stackoverflow.com/questions/52964552
复制相似问题