多分类器神经网络问题

时间:2018-10-24 08:43:41

标签: python neural-network classification matrix-multiplication

我正在实现一个多类神经网络,该网络将识别输入图像中的数字。输入图像为五乘五像素,显示五个数字。因此,神经网络模型包含25个输入节点。 4个输出节点(我们必须对5个输出进行分类)和50个隐藏节点。我将sigmoid函数用作隐藏节点的激活函数,并将softmax函数用作输出节点的激活函数。
我的输入参数X包含堆叠的二维图像数据,即5 * 5 * 5三维矩阵。因此,我已使用 np.reshape(X [:,:,x],25)转换为(25,)向量,这样我就可以轻松获得加权和(因为权重为25 * 50用于隐藏节点的输入,50 * 5用于隐藏节点的输出)。

我面临的问题是,当我分别计算用于隐藏输入和输出隐藏的Delta时,出现值错误“ ValueError:形状(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)

1 个答案:

答案 0 :(得分:1)

这些数组(N,)称为第一等级数组。如果在计算中使用它们,将会得到意外的值或错误。为了使它们适合使用,请np.reshape(N,1)对其进行修复。但是...似乎您对神经网络的理解有很多漏洞,我建议您执行以下操作:

首先,您需要一些线性代数的基础知识,至少要学习如何在纸上计算2矩阵/向量的内积。 khanacademy.org有一个免费的线性代数课程,非常容易上手。

第二,参加一门机器学习课程,coursera.org的Andrew Ng提供了宝贵的材料。他著名的机器学习课程很棒,但是如果您想让神经网络学习他的深度学习专业课程1。这些都可以免费审核。

最后一件事,不要重新发明轮子。有许多免费,流行,高效和易于使用的机器学习框架。 tensorflow,scikit学习,pytorch等。

学习愉快:)