下面是基于PyTorch框架的RNN网络实现代码:
import torch
import torch.nn as nn
# 定义RNN模型
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
# 输入权重矩阵
self.W_xh = nn.Parameter(torch.randn(input_size, hidden_size))
# 隐藏权重矩阵
self.W_hh = nn.Parameter(torch.randn(hidden_size, hidden_size))
# 输出权重矩阵
self.W_hy = nn.Parameter(torch.randn(hidden_size, output_size))
# 隐藏层偏置向量
self.b_h = nn.Parameter(torch.randn(hidden_size))
# 输出层偏置向量
self.b_y = nn.Parameter(torch.randn(output_size))
def forward(self, x):
h = torch.zeros(1, self.hidden_size)
for i in range(x.size(0)):
h = torch.tanh(torch.mm(x[i], self.W_xh) + torch.mm(h, self.W_hh) + self.b_h)
y = torch.mm(h, self.W_hy) + self.b_y
return y
# 实例化模型
input_size = 10
hidden_size = 20
output_size = 1
model = RNN(input_size, hidden_size, output_size)
# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 输入数据
x = torch.randn(5, input_size)
y_true = torch.randn(output_size)
# 训练模型
for epoch in range(100):
model.zero_grad()
y_pred = model(x)
loss = criterion(y_pred, y_true)
loss.backward()
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')
# 测试模型
with torch.no_grad():
y_pred = model(x)
print(f'Predicted: {y_pred}, True: {y_true}')
以上我利用pytorch搭建了一个RNN模型,用于序列数据的预测。详细解释一下代码:
- 定义RNN模型类,继承自
nn.Module
。 - 在初始化方法中,定义了输入权重矩阵 W x h W_xh Wxh、隐藏权重矩阵 W h h W_hh Whh、输出权重矩阵 W h y W_hy Why、隐藏层偏置向量 b h b_h bh和输出层偏置向量 b y b_y by。
- f o r w a r d forward forward方法实现了RNN的前向传播过程。对于每个时间步,计算隐藏状态 h h h,并在最后一个时间步计算输出 y y y。
- 实例化RNN模型,设置输入维度、隐藏层维度和输出维度。
- 定义损失函数 M S E L o s s MSELoss MSELoss和优化器 S G D SGD SGD。
- 生成随机的输入数据 x x x和真实标签 y t r u e y_true ytrue。
- 训练模型,通过前向传播、计算损失、反向传播和更新权重。
- 每隔10个epoch打印损失,观察模型训练过程。
- 在测试阶段,关闭梯度计算,预测输入数据的输出,并与真实标签进行比较。