bp神经网络回归一个隐藏层relu函数代码实例
时间: 2023-08-08 22:07:25 浏览: 89
bp神经网络代码示例
下面是一个使用 ReLU 激活函数的单隐藏层 BP 神经网络回归的代码实例:
```python
import numpy as np
class NeuralNetwork:
def __init__(self, input_dim, hidden_dim, output_dim):
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
# 初始化权重和偏置
self.weights1 = np.random.randn(self.input_dim, self.hidden_dim) * np.sqrt(2.0 / self.input_dim)
self.bias1 = np.zeros((1, self.hidden_dim))
self.weights2 = np.random.randn(self.hidden_dim, self.output_dim) * np.sqrt(2.0 / self.hidden_dim)
self.bias2 = np.zeros((1, self.output_dim))
def forward(self, X):
# 前向传播
self.z1 = np.dot(X, self.weights1) + self.bias1
self.a1 = np.maximum(0, self.z1) # ReLU 激活函数
self.z2 = np.dot(self.a1, self.weights2) + self.bias2
y_hat = self.z2
return y_hat
def backward(self, X, y, y_hat, learning_rate):
# 反向传播
delta2 = y_hat - y
dW2 = np.dot(self.a1.T, delta2)
db2 = np.sum(delta2, axis=0, keepdims=True)
delta1 = np.dot(delta2, self.weights2.T) * (self.z1 > 0) # ReLU 的导数
dW1 = np.dot(X.T, delta1)
db1 = np.sum(delta1, axis=0, keepdims=True)
# 更新权重和偏置
self.weights2 -= learning_rate * dW2
self.bias2 -= learning_rate * db2
self.weights1 -= learning_rate * dW1
self.bias1 -= learning_rate * db1
def train(self, X, y, learning_rate, num_epochs):
loss_history = []
for i in range(num_epochs):
y_hat = self.forward(X)
loss = np.mean(np.square(y_hat - y))
loss_history.append(loss)
self.backward(X, y, y_hat, learning_rate)
if i % 100 == 0:
print('Epoch', i, '- Loss:', loss)
return loss_history
```
这个神经网络的结构为输入层、隐藏层和输出层,其中隐藏层使用了 ReLU 激活函数。在 forward() 方法中,我们首先计算隐藏层的输入 z1,然后通过 ReLU 激活函数得到隐藏层的输出 a1。接着,我们计算输出层的输入 z2,并将其作为输出 y_hat 返回。
在 backward() 方法中,我们首先计算输出层的残差 delta2,然后使用它来计算输出层权重和偏置的梯度 dW2 和 db2。接着,我们计算隐藏层的残差 delta1,并使用它来计算隐藏层权重和偏置的梯度 dW1 和 db1。注意,由于隐藏层使用了 ReLU 激活函数,因此我们需要在计算 delta1 时乘以 ReLU 函数的导数。
最后,在 train() 方法中,我们执行 num_epochs 次训练,并记录每次训练的损失值。每轮训练中,我们首先通过 forward() 方法计算预测值 y_hat,然后计算预测值 y_hat 和真实值 y 之间的均方误差作为损失值。接着,我们使用 backward() 方法进行反向传播,更新神经网络的参数。最后,如果当前训练轮数 i 能够被 100 整除,就输出当前的训练轮数和损失值。
阅读全文