Python 实现 RNN 和 LSTM:代码示例
以下是 Python 编程实现 RNN 和 LSTM 的示例代码:
RNN:
import numpy as np
# 定义 sigmoid 激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义 RNN 类
class RNN:
def __init__(self, input_size, hidden_size, output_size):
# 定义输入、隐藏和输出层的尺寸
self.input_size = input_size
self.hidden_size = hidden_size
self.output_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, x):
# 使用零初始化隐藏状态
h = np.zeros((self.hidden_size, 1))
# 初始化隐藏状态和输出列表
hs = []
ys = []
# 对每个输入执行前向传播
for t in range(len(x)):
# 使用当前输入和先前隐藏状态计算下一个隐藏状态
h = np.tanh(np.dot(self.Wxh, x[t]) + np.dot(self.Whh, h) + self.bh)
# 使用当前隐藏状态计算输出
y = np.dot(self.Why, h) + self.by
# 对输出应用 sigmoid 激活函数
y = sigmoid(y)
# 将当前隐藏状态和输出附加到各自的列表中
hs.append(h)
ys.append(y)
# 返回隐藏状态和输出列表
return hs, ys
# 使用输入尺寸为 3、隐藏尺寸为 4 和输出尺寸为 2 实例化一个 RNN
RNN = RNN(3, 4, 2)
# 定义一些输入
x = [np.array([[1], [2], [3]]), np.array([[4], [5], [6]]), np.array([[7], [8], [9]])]
# 对输入执行前向传播
hs, ys = RNN.forward(x)
# 打印隐藏状态和输出
print('Hidden states:')
for h in hs:
print(h)
print('Outputs:')
for y in ys:
print(y)
LSTM:
import numpy as np
# 定义 sigmoid 激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义 tanh 激活函数
def tanh(x):
return np.tanh(x)
# 定义 LSTM 类
class LSTM:
def __init__(self, input_size, hidden_size, output_size):
# 定义输入、隐藏和输出层的尺寸
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
# 使用随机值初始化权重和偏差
self.Wxi = np.random.randn(hidden_size, input_size) * 0.01
self.Whi = np.random.randn(hidden_size, hidden_size) * 0.01
self.Wxf = np.random.randn(hidden_size, input_size) * 0.01
self.Whf = np.random.randn(hidden_size, hidden_size) * 0.01
self.Wxo = np.random.randn(hidden_size, input_size) * 0.01
self.Who = np.random.randn(hidden_size, hidden_size) * 0.01
self.Wxc = np.random.randn(hidden_size, input_size) * 0.01
self.Whc = np.random.randn(hidden_size, hidden_size) * 0.01
self.Why = np.random.randn(output_size, hidden_size) * 0.01
self.bi = np.zeros((hidden_size, 1))
self.bf = np.zeros((hidden_size, 1))
self.bo = np.zeros((hidden_size, 1))
self.bc = np.zeros((hidden_size, 1))
self.by = np.zeros((output_size, 1))
def forward(self, x):
# 使用零初始化隐藏状态和单元状态
h = np.zeros((self.hidden_size, 1))
c = np.zeros((self.hidden_size, 1))
# 初始化隐藏状态和输出列表
hs = []
ys = []
# 对每个输入执行前向传播
for t in range(len(x)):
# 使用当前输入和先前隐藏状态计算输入、遗忘和输出门
i = sigmoid(np.dot(self.Wxi, x[t]) + np.dot(self.Whi, h) + self.bi)
f = sigmoid(np.dot(self.Wxf, x[t]) + np.dot(self.Whf, h) + self.bf)
o = sigmoid(np.dot(self.Wxo, x[t]) + np.dot(self.Who, h) + self.bo)
# 使用当前输入和先前隐藏状态计算候选单元状态
c_cand = tanh(np.dot(self.Wxc, x[t]) + np.dot(self.Whc, h) + self.bc)
# 使用输入和遗忘门将候选单元状态与先前单元状态相结合,计算单元状态
c = i * c_cand + f * c
# 通过将输出门应用于单元状态计算隐藏状态
h = o * tanh(c)
# 使用当前隐藏状态计算输出
y = np.dot(self.Why, h) + self.by
# 对输出应用 sigmoid 激活函数
y = sigmoid(y)
# 将当前隐藏状态和输出附加到各自的列表中
hs.append(h)
ys.append(y)
# 返回隐藏状态和输出列表
return hs, ys
# 使用输入尺寸为 3、隐藏尺寸为 4 和输出尺寸为 2 实例化一个 LSTM
LSTM = LSTM(3, 4, 2)
# 定义一些输入
x = [np.array([[1], [2], [3]]), np.array([[4], [5], [6]]), np.array([[7], [8], [9]])]
# 对输入执行前向传播
hs, ys = LSTM.forward(x)
# 打印隐藏状态和输出
print('Hidden states:')
for h in hs:
print(h)
print('Outputs:')
for y in ys:
print(y)
原文地址: https://www.cveoy.top/t/topic/nzey 著作权归作者所有。请勿转载和采集!