使用这段代码仍然报错,请修改成一段不同于以上两段代码的正确代码 报错内容如下: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, W3.T).T * dtanh(z2) File "<__array_function__ internals>", line 200, in dot ValueError: shapes (365,365) and (1,3) not aligned: 365 (dim 1) != 1 (dim 0)
时间: 2024-03-24 11:40:12 浏览: 17
这个报错是因为在计算 delta2 的时候,仍然使用了 delta3 和 W3 的乘积,但是它们的形状不匹配。具体来说,delta3 的形状是 (batch_size, output_dim),而 W3 的形状是 (output_dim, hidden_dim),所以 delta3 和 W3 的乘积的形状是 (batch_size, hidden_dim),而不是 (1, 3)。
为了解决这个问题,可以将 delta3 和 W3 的乘积的顺序交换一下,这样就可以得到形状为 (hidden_dim, batch_size) 的 delta2,然后再将其转置成形状为 (batch_size, hidden_dim) 的矩阵,这样就可以和 a1 相乘得到 dW2 了。修改后的 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(W3, delta3.T) * dtanh(z2).T
dW2 = np.outer(a1, delta2.T)
db2 = delta2.T
delta1 = np.dot(W2, delta2.T) * dtanh(z1).T
dW1 = np.outer(x, delta1.T)
db1 = delta1.T
return dW1, db1, dW2, db2, dW3, db3
```
注意,我们在计算 delta2 的时候,先将 delta3 的形状转置成 (output_dim, batch_size),然后再和 W3 相乘,得到形状为 (hidden_dim, batch_size) 的 delta2。然后再将其转置成形状为 (batch_size, hidden_dim) 的矩阵,这样就可以和 a1 相乘得到 dW2 了。同样地,在计算 delta1 和 dW1 的时候,也需要将 delta2 和 dW2 的形状转置。