rnn循环神经网络代码
时间: 2023-07-27 11:07:07 浏览: 102
RNN循环神经网络
以下是一个基本的RNN循环神经网络的代码示例:
```python
import numpy as np
class RNN:
def __init__(self, input_size, hidden_size, output_size):
# 初始化权重参数
self.Wxh = np.random.randn(hidden_size, input_size) * 0.01 # 输入层到隐藏层的权重矩阵
self.Whh = np.random.randn(hidden_size, hidden_size) * 0.01 # 隐藏层到隐藏层的权重矩阵
self.Why = np.random.randn(output_size, hidden_size) * 0.01 # 隐藏层到输出层的权重矩阵
self.bh = np.zeros((hidden_size, 1)) # 隐藏层偏差项
self.by = np.zeros((output_size, 1)) # 输出层偏差项
def forward(self, inputs):
# 定义前向传播过程
h = np.zeros((self.Whh.shape[0], 1)) # 初始化隐藏层状态
self.last_inputs = inputs # 保存上一次输入,用于反向传播时计算梯度
self.last_hs = { 0: h } # 保存所有隐藏层状态,用于反向传播时计算梯度
# 遍历时间步
for i, x in enumerate(inputs):
h = np.tanh(self.Wxh @ x + self.Whh @ h + self.bh) # 更新隐藏层状态
self.last_hs[i + 1] = h # 保存隐藏层状态
y = self.Why @ h + self.by # 计算输出
return y
def backward(self, dy):
# 定义反向传播过程
n = len(self.last_inputs) # 时间步数量
# 计算输出层权重和偏差项的梯度
dWhy = dy @ self.last_hs[n].T
dby = dy
# 初始化隐藏层状态和权重、偏差项的梯度
dh = self.Why.T @ dy
dhraw = (1 - self.last_hs[n] ** 2) * dh
dWxh = np.zeros_like(self.Wxh)
dWhh = np.zeros_like(self.Whh)
dbh = np.zeros_like(self.bh)
# 从后往前遍历时间步
for t in reversed(range(n)):
# 计算当前时间步的梯度
dWhh += dhraw @ self.last_hs[t].T
dbh += dhraw
dx = self.Wxh.T @ dhraw
# 更新当前时间步之前的梯度
dhraw = (1 - self.last_hs[t] ** 2) * dx + dhraw @ self.Whh.T
# 限制梯度范围,防止梯度爆炸
for dparam in [dWxh, dWhh, dWhy, dbh, dby]:
np.clip(dparam, -5, 5, out=dparam)
# 返回梯度以便更新权重和偏差项
return dWxh, dWhh, dWhy, dbh, dby
```
这个RNN类接受三个参数:输入层大小、隐藏层大小和输出层大小。它实现了前向传播过程和反向传播过程,其中前向传播过程使用tanh作为激活函数,反向传播过程使用梯度截断来防止梯度爆炸。
阅读全文