返回
利用PyTorch打造非凡循环神经网络
人工智能
2024-01-03 19:41:53
在人工智能领域,循环神经网络(RNN)以其处理顺序数据的卓越能力而闻名。借助其强大的内存机制,RNN在自然语言处理、时间序列预测和图像识别等任务中表现非凡。本文将使用PyTorch框架,带领你踏上一段探索和掌握RNN的奇妙旅程。
亲手构建循环神经网络
为了深入理解RNN的机制,我们将亲自动手构建一个简单的手写RNN。我们将使用PyTorch的nn.Module类来定义我们的RNN模型,该模型将包含一个循环层和一个输出层。循环层将使用tanh激活函数,而输出层将使用线性激活函数。
import torch
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
x, _ = self.rnn(x)
x = self.fc(x)
return x
驰骋高速公路数据
现在,让我们使用PEMS04数据集对我们的RNN进行实验。该数据集包含来自高速公路传感器的实时交通数据。我们将使用RNN预测流量的未来值。
import torch
import numpy as np
# 加载数据
data = np.load('pems04.npy')
# 分割数据
train_data = data[:int(0.8 * len(data))]
test_data = data[int(0.8 * len(data)):]
# 创建PyTorch数据集
train_dataset = torch.utils.data.TensorDataset(torch.from_numpy(train_data).float())
test_dataset = torch.utils.data.TensorDataset(torch.from_numpy(test_data).float())
# 创建数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False)
优化与评估
接下来,我们将使用均方误差作为损失函数,并使用Adam优化器训练我们的RNN。为了评估模型的性能,我们将使用平均绝对误差(MAE)。
import torch.optim as optim
# 创建模型
model = RNN(input_size=1, hidden_size=64, output_size=1)
# 优化器和损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)
loss_fn = nn.MSELoss()
# 训练
for epoch in range(100):
for x, y in train_loader:
y_pred = model(x)
loss = loss_fn(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 评估
mae = []
with torch.no_grad():
for x, y in test_loader:
y_pred = model(x)
mae.append(torch.mean(torch.abs(y_pred - y)))
print(f"平均绝对误差:{np.mean(mae)}")