当前位置: 首页 > 知识库问答 >
问题:

反向传播(神经网络)中获取增量项时的尺寸误差

吕华彩
2023-03-14

我正在创建一个具有以下维度的三层图像识别神经网络:400个特征、40个节点、40个节点、10个目标(数字0到9的图像),因此这些是我的权重(θ):

 theta1 = np.random.uniform(low=0.00001, high=0.0001, size=(40,401))
 theta2 = np.random.uniform(low=0.00001, high=0.0001, size=(40,41))
 theta3 = np.random.uniform(low=0.00001, high=0.0001, size=(10,41))

我遵循吴恩达的方法。我在反向传播工作中遇到了一些问题。首先,我通过找出实际结果和预测之间的差异来得到delta\u 4项。然后,使用以下等式获得剩余的δ项,

其中g'是sigmoid函数的导数。我编码了以下函数:

def get_delta(nodes_current, theta_current, delta_previous):
     derivative = np.multiply(nodes_current, 1-nodes_current)
     matmul_term = np.matmul(np.transpose(theta_current), delta_previous)
     delta_current = np.multiply(matmul_term, derivative)
     return delta_current

然后,获得梯度的整个反向传播过程如下所示:

def backward_prop3(y_vectors, a1, a2, a3, a4, theta1, theta2, theta3):
     #y_vectors is a 10 by m (num of training examples) matrix
     #a1 is the features
     #a2, a3 are the hidden nodes
     #a4 is the output

     m = y_vectors.shape[1]
 
     delta4 = a4 - y_vectors

     delta3 = get_delta(a3, theta3, delta4)
     triangle3 = np.matmul(delta4, np.transpose(a3))

     delta2 = get_delta(a2, theta2, delta3)
     triangle2 = np.matmul(delta3, np.transpose(a2))

     triangle1 = np.matmul(delta2[1:,:],np.transpose(a1))

     grad3 = (1/m)*triangle1
     grad2 = (1/m)*triangle2 
     grad1 = (1/m)*triangle1 

     return grad1, grad2, grad3

问题发生在获取delta2的行中,特别是在get_delta函数行中:

matmul_term = np.matmul(np.transpose(theta_current), delta_previous)

错误是

matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 51 is different from 50)

我已经检查了θ矩阵的维数,也复习了课程笔记,但我不明白为什么这不起作用,因为我完全按照方程式所示来实现它。

共有1个答案

佴保臣
2023-03-14

如果θ的大小为41,而有40个特征会导致错误。若要对此进行调试,请确保所有矩阵都具有有效的维数,以便它们可以彼此相乘。

delta2的尺寸为41x41,theta2的尺寸为40x41。因此,转置(theta2)*delta2将尝试乘以41x40*41x41。这会导致尺寸不匹配。theta2的尺寸应为41x。。。这样才能起作用。

 类似资料:
  • 我正在尝试实现一个简单的神经网络。我知道已经有很多可用的库,这不是重点。 我的网络只有3层:一个输入层一个隐藏层一个输出层 输出层有8个神经元,每个神经元代表不同的类。 我知道如何实现feedfoward算法,但我真的很难实现反向传播算法。 这是我到目前为止得出的结论: 我尝试使用Iris数据集进行测试:https://en.wikipedia.org/wiki/Iris_flower_data_

  • 考虑具有以下架构的卷积神经网络: Standford的深度学习教程使用以下等式来实现这一点: 然而,在使用这个等式时,我面临以下问题: 我做错了什么?有人能解释一下如何通过卷积层传播错误吗? 简单的MATLAB示例将受到高度赞赏。

  • 我很难构建好的神经网络教学算法,因为有一些人工操作。第一件事:我的目标是教nn-xor函数,我使用sigmoid作为激活函数和简单的梯度下降。前馈很容易,但backprop在某种程度上令人困惑——大多数算法描述中常见的步骤有:1。计算输出层上的错误。2、将此错误传播到有关权重3的隐藏层。更新突触上的权重 所以我的问题:1。偏差也应该更新吗?如果是,如何更新?目前我随机选择偏差[0.5;1]?2.在

  • 我正在尝试用RELU实现神经网络。 输入层- 以上是我的神经网络结构。我对这个relu的反向传播感到困惑。对于RELU的导数,如果x 有人能解释一下我的神经网络架构的反向传播“一步一步”吗?

  • 我对TensorFlow和LSTM架构相当陌生。我在计算数据集的输入和输出(x_train、x_test、y_trainy_test)时遇到了问题。 我最初输入的形状: X_列车:(366,4) Ytrain和Ytest是一系列股票价格。Xtrain和Xtest是我想学习的四个预测股价的功能。 这是产生的错误: -------------------------------------------

  • 我们首先回顾DNN的反向传播算法。在DNN中,我们是首先计算出输出层的$$deltaL:deltaL = frac{partial J(W,b)}{partial zL} = frac{partial J(W,b)}{partial aL}odot sigma{'}(zL)$$ 利用数学归纳法,用$$delta{l+1}$$的值一步步的向前求出第l层的$$deltal$$,表达式为:$$delta