RNN的重要代码及解析
时间: 2024-03-16 09:43:39 浏览: 14
以下是一个简单的RNN的Python代码:
```python
import numpy as np
# 定义一个RNN类
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):
xs, hs, ys, ps = {}, {}, {}, {}
hs[-1] = np.zeros((self.Whh.shape[0], 1))
for t in range(len(inputs)):
xs[t] = np.zeros((self.Wxh.shape[1], 1))
xs[t][inputs[t]] = 1 # one-hot 编码
hs[t] = np.tanh(np.dot(self.Wxh, xs[t]) + np.dot(self.Whh, hs[t-1]) + self.bh)
ys[t] = np.dot(self.Why, hs[t]) + self.by
ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t])) # softmax函数
return xs, hs, ys, ps
# 测试代码
input_size = 10
hidden_size = 20
output_size = 5
inputs = [1, 2, 3, 4, 5]
rnn = RNN(input_size, hidden_size, output_size)
xs, hs, ys, ps = rnn.forward(inputs)
print(ps)
```
该代码实现了一个简单的RNN模型,其中`Wxh`、`Whh`、`Why`分别是输入层到隐藏层、隐藏层到隐藏层、隐藏层到输出层的权重矩阵,`bh`、`by`分别是隐藏层、输出层的偏置项。`forward`函数实现了RNN的前向传播过程,其中`xs`、`hs`、`ys`、`ps`分别是输入、隐藏层、输出、输出的概率分布。在该代码中,隐藏层的激活函数为tanh函数,输出层的激活函数为softmax函数。
RNN的核心思想是将前一时刻的隐藏状态作为当前时刻的输入,从而使模型能够捕捉到序列数据中的时序关系。具体而言,在该代码中,每个时刻的输入被编码为一个one-hot向量,并与权重矩阵相乘得到隐藏层的输入。隐藏层的输出经过一个tanh激活函数得到新的隐藏状态,然后再与权重矩阵相乘得到输出层的输入。输出层的输出经过一个softmax函数得到输出的概率分布。在循环过程中,前一时刻的隐藏状态被传递给当前时刻,从而实现了RNN的时序处理。