写一个RNN的预测代码
时间: 2023-12-01 09:10:43 浏览: 74
好的,以下是一个简单的RNN预测代码,使用PyTorch实现:
```
import torch
import torch.nn as nn
import numpy as np
# 定义RNN模型
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
self.i2o = nn.Linear(input_size + hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
combined = torch.cat((input, hidden), 1)
hidden = self.i2h(combined)
output = self.i2o(combined)
output = self.softmax(output)
return output, hidden
def initHidden(self):
return torch.zeros(1, self.hidden_size)
# 定义训练数据
input_data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
target_data = np.array([2, 4, 6, 8, 10, 12, 14, 16, 18, 20])
# 转换为Tensor
input_tensor = torch.from_numpy(input_data).unsqueeze(1).float()
target_tensor = torch.from_numpy(target_data).unsqueeze(1).float()
# 定义超参数
input_size = 1
hidden_size = 10
output_size = 1
learning_rate = 0.01
# 创建RNN模型
rnn = RNN(input_size, hidden_size, output_size)
# 定义损失函数和优化器
loss_fn = nn.MSELoss()
optimizer = torch.optim.Adam(rnn.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(1000):
hidden = rnn.initHidden()
rnn.zero_grad()
for i in range(input_tensor.size(0)):
output, hidden = rnn(input_tensor[i], hidden)
loss = loss_fn(output, target_tensor[-1])
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch: {}, Loss: {}'.format(epoch, loss.item()))
# 预测模型
hidden = rnn.initHidden()
for i in range(input_tensor.size(0)):
output, hidden = rnn(input_tensor[i], hidden)
print('Input: {}, Target: {}, Output: {}'.format(input_data[i], target_data[i], output.item()))
```
这个代码使用一个简单的RNN模型来进行序列预测。训练数据是一个简单的1到10的序列,目标是每个元素乘以2得到的序列。模型的输入和输出都是标量,因此需要将训练数据和目标数据转换为形状为`(seq_length, 1)`的张量。在训练过程中,将RNN的输出与目标数据的最后一个元素进行比较,使用均方误差损失函数进行优化。最后,使用训练好的模型进行预测并输出结果。
阅读全文