以下是 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)
Python 实现 RNN 和 LSTM:代码示例

原文地址: https://www.cveoy.top/t/topic/nzey 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录