在反向传播期间,获取ValueError:操作数不能与形状(1,3)(1,4)一起广播

时间:2019-05-15 21:11:57

标签: python matrix neural-network jupyter-notebook backpropagation

我创建了一个神经网络,该神经网络具有一个包含3个节点的隐藏层,将S形函数用作激活函数

输入层(2个节点):
X | X是大小为(1x2)的矩阵

隐藏层(3个节点):
W1 =>的大小为(3x2)
Z1 = X.(W1.T)+ b
A1 =σ(Z)| (W1.T)是矩阵W的转置

输出层(4个节点):
W2 =>的大小为(4x3)
Z2 = A1。(W2.T)+ b
A2 =σ(Z)
E = 0.5 *(Y- A2)^ 2 | Y是大小为(1x4)的矩阵

我想应用链式规则来计算隐藏层的W如何影响E(成本函数)

dEdW1 = dEdA2 * dA2dZ2 * dZ2dA1 * dA1dZ1 * dZ1dW1
      =(A2-Y)*(σ(Z2)*(1-σ(Z2)))* W2.T *(σ(Z1)*(1-σ(Z1)))* X
矩阵大小=>(1x4)*(1x4)*(3x4)*(1x3)*(1x2)

我知道我的导数存在问题,因为我无法将矩阵相乘(它们的大小不同),有人可以指出如何解决此问题
这是实现:

sample-neural-network

2 个答案:

答案 0 :(得分:0)

您可能应该转置矩阵。

矩阵乘法的工作方式类似于“ AxB * BxC = AxC”,因此您将无法进行乘法(1x4)*(3x4)。尝试转置第二个,这样您将获得(1x4)*(4x3)乘法。

并对其余部分进行重新排序,因此它看起来应该像(4x1)(1x4)(4x3)(3x1)(1x2)

答案 1 :(得分:0)

切换体重矩阵。假设以下情况:例如,给定尺寸为4x2的输入矩阵X(也就是说,您有4个输入-也就是行-每个输入的维数为2个元素),例如:

  

[[0,0],[0,1],[1,0],[1,1]]

如果您的隐藏层有4个神经元,则w0权重矩阵的大小将变为2x4。您将拥有一个由4个元素组成的b0偏差矢量,并且在计算该层的激活率后,您将得到:

z1 = X @ w0 + b0  # 4x2 * 2x4 + 1x4 = 4x4
a1 = f(z1)  # 4x4

然后说,在输出层中,您有2个元素,这些元素使w1矩阵的大小为4x2,b1向量的大小为2。

z2 = a1 @ w1 + b1  # 4x4 * 4x2 + 1x2 = 4x2
a2  = f(z)  # 4x2

在反向传播期间,您为每个图层计算的增量为:

d_O = (Y - T) * f'(z2)
d_H = d_O @ W1.T * f'(z1)

其中Y是您的网络对尺寸的猜测:4x2

T是训练标签,因此必须匹配:4x2

乘法是逐元素乘法,这使您

  

d_O大小为4x2

计算隐藏层增量尺寸非常相似:

d_O:4x2

W1的大小为4x2,因此转置为2x4,@是您的d_H尺寸的标准矩阵乘法,结果为:

  

d_H大小为4x4

要更新体重,您可以:

dW1 := a1.T @ d_O
dW2 := X.T @ d_H

其中a1是4x4矩阵,d_O是4x2矩阵,这使dW1成为4x2矩阵。 W1的大小为4x2。

X是大小为4x2的输入矩阵,则X.T为2x4,而d_H为4x4,这使得dW0为2x4。您原来的W0是2x4。

Bias三角洲要简单得多

db1 = np.sum(d_O, axis=0)
db0 = np.sum(d_H, axis=0)