返回

利用PyTorch打造非凡循环神经网络

人工智能

在人工智能领域,循环神经网络(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)}")