这段反向传播代码出现报错 请解释报错原因并修改代码 def backward(y_pred, y_true, cache): x, z1, a1, z2, a2, z3 = cache delta3 = y_pred - y_true dW3 = np.outer(a2, delta3) db3 = delta3 delta2 = np.dot(delta3, W3.T) * dtanh(z2) dW2 = np.outer(a1, delta2) db2 = delta2 delta1 = np.dot(delta2, W2.T) * dtanh(z1) dW1 = np.outer(x, delta1) db1 = delta1 return dW1, db1, dW2, db2, dW3, db3 报错如下:Traceback (most recent call last): File "/Users/tiger/Desktop/英才计划/bp神经网络/交叉熵bp模型的副本.py", line 92, in <module> W1, b1, W2, b2, W3, b3 = momentum_bp(X_train, y_train) File "/Users/tiger/Desktop/英才计划/bp神经网络/交叉熵bp模型的副本.py", line 72, in momentum_bp dW1, db1, dW2, db2, dW3, db3 = backward(y_pred, y, cache) File "/Users/tiger/Desktop/英才计划/bp神经网络/交叉熵bp模型的副本.py", line 56, in backward delta2 = np.dot(delta3.reshape(1, -1), W3.T) * dtanh(z2) File "<__array_function__ internals>", line 200, in dot ValueError: shapes (1,133225) and (1,3) not aligned: 133225 (dim 1) != 1 (dim 0)
时间: 2024-03-24 07:40:10 浏览: 63
这个报错是因为在计算 delta2 的时候,使用了 delta3 和 W3 的乘积,但是它们的形状不匹配。具体来说,delta3 的形状是 (batch_size, output_dim),而 W3 的形状是 (output_dim, hidden_dim),所以 delta3 和 W3 的乘积的形状是 (batch_size, hidden_dim),而不是 (1, 3)。
为了解决这个问题,可以将 delta3 的形状改为 (output_dim, batch_size),然后再和 W3 相乘,这样就可以得到形状为 (output_dim, hidden_dim) 的 delta2 了。修改后的 backward 函数如下:
```python
def backward(y_pred, y_true, cache):
x, z1, a1, z2, a2, z3 = cache
delta3 = y_pred - y_true
dW3 = np.outer(a2, delta3)
db3 = delta3
delta2 = np.dot(delta3, W3.T).T * dtanh(z2)
dW2 = np.outer(a1, delta2)
db2 = delta2
delta1 = np.dot(delta2, W2.T).T * dtanh(z1)
dW1 = np.outer(x, delta1)
db1 = delta1
return dW1, db1, dW2, db2, dW3, db3
```
注意,我们在计算 delta2 的时候,先对 delta3 进行了转置操作,然后再和 W3 相乘。这是因为 np.dot 函数默认是对最后一维进行矩阵乘法,也就是说,如果 delta3 的形状是 (batch_size, output_dim),W3 的形状是 (output_dim, hidden_dim),那么它们的乘积的形状是 (batch_size, hidden_dim)。而在这里,我们需要的是形状为 (output_dim, hidden_dim) 的 delta2,所以需要对 delta3 进行转置操作。
阅读全文