【问题标题】:Multiclass classifier neural network problem多类分类器神经网络问题
【发布时间】:2019-03-28 14:33:43
【问题描述】:

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

我面临的问题是,当我分别计算输入到隐藏和隐藏到输出的 Delta 时,我有值错误 "ValueError: shape (50,) and (5,5) not aligned: 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)

【问题讨论】:

    标签: python neural-network classification matrix-multiplication


    【解决方案1】:

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

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

    其次,参加一门机器学习课程,coursera.org 上的 Andrew Ng 拥有宝贵的资料。他著名的机器学习课程很棒,但是如果您想要神经网络,请参加他的深度学习专业课程 1。这些都可以免费审核。

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

    学习愉快:)

    【讨论】:

    • 感谢您的反馈。实际上,我从头开始而不使用任何框架的原因是为了获得对 NN 的基本了解,以便将来如果我想修改某些东西(损失函数等),我可以调整和使用我的 NN。跨度>
    • 不客气,这确实是正确的学习方式,吴恩达教授的课程基本上是你现在需要的,相信我:)
    猜你喜欢
    • 2015-04-18
    • 2012-10-08
    • 2019-07-17
    • 2021-05-31
    • 2019-01-30
    • 2017-08-30
    • 2018-06-24
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多