请用numpy实现反向传播求梯度
时间: 2024-05-10 07:14:39 浏览: 187
好的,以下是一个简单的例子,演示如何用numpy实现反向传播求梯度:
```
import numpy as np
# 定义模型参数
W1 = np.random.randn(2, 4)
b1 = np.zeros((1, 4))
W2 = np.random.randn(4, 1)
b2 = np.zeros((1, 1))
# 定义输入和输出
X = np.random.randn(2, 10)
Y = np.random.randn(1, 10)
# 定义激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 前向传播
Z1 = np.dot(W1, X) + b1
A1 = sigmoid(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2)
# 计算损失函数
cost = -np.mean(Y * np.log(A2) + (1 - Y) * np.log(1 - A2))
# 反向传播
dZ2 = A2 - Y
dW2 = 1 / X.shape[1] * np.dot(dZ2, A1.T)
db2 = 1 / X.shape[1] * np.sum(dZ2, axis=1, keepdims=True)
dZ1 = np.dot(W2.T, dZ2) * sigmoid(Z1) * (1 - sigmoid(Z1))
dW1 = 1 / X.shape[1] * np.dot(dZ1, X.T)
db1 = 1 / X.shape[1] * np.sum(dZ1, axis=1, keepdims=True)
# 输出梯度
print("dW1 =", dW1)
print("db1 =", db1)
print("dW2 =", dW2)
print("db2 =", db2)
```
以上代码实现了一个两层的神经网络,使用sigmoid作为激活函数,并使用交叉熵作为损失函数。在反向传播计算梯度时,需要分别计算每一层的梯度,并根据链式法则将梯度传递回去。最终输出的梯度可以用于更新模型参数。
阅读全文