用python写一个rnn代码,要求体现每一步公式,输入为正弦函数的值,预测后续的数据且每一步完成后都输出结果图
时间: 2024-02-13 16:00:12 浏览: 24
好的,以下是一个使用Python和PyTorch实现的简单的RNN代码,用于预测正弦函数的下一个值:
```
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
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.tanh = nn.Tanh()
def forward(self, input, hidden):
combined = torch.cat((input, hidden), 1)
hidden = self.tanh(self.i2h(combined))
output = self.i2o(combined)
return output, hidden
def initHidden(self):
return torch.zeros(1, self.hidden_size)
# 训练模型
def train(input_tensor, target_tensor, rnn):
hidden = rnn.initHidden()
rnn.zero_grad()
loss = 0
for i in range(input_tensor.size()[0]):
output, hidden = rnn(input_tensor[i], hidden)
loss += criterion(output, target_tensor[i])
loss.backward()
for p in rnn.parameters():
p.data.add_(p.grad.data, alpha=-0.1)
return output, loss.item() / input_tensor.size()[0]
# 预测模型
def predict(input_tensor, rnn):
hidden = rnn.initHidden()
predicted_tensor = torch.zeros(input_tensor.size())
for i in range(input_tensor.size()[0]):
output, hidden = rnn(input_tensor[i], hidden)
predicted_tensor[i] = output
return predicted_tensor
# 训练数据
n_steps = 200
train_data = np.sin(np.linspace(0, 2*np.pi, n_steps+1))
train_input = torch.from_numpy(train_data[:-1]).float().view(n_steps, 1, 1)
train_target = torch.from_numpy(train_data[1:]).float().view(n_steps, 1)
# 定义模型参数和损失函数
input_size = 1
hidden_size = 16
output_size = 1
rnn = RNN(input_size, hidden_size, output_size)
criterion = nn.MSELoss()
# 训练模型
n_epochs = 2000
all_losses = []
for epoch in range(1, n_epochs + 1):
output, loss = train(train_input, train_target, rnn)
all_losses.append(loss)
if epoch % 100 == 0:
print('Epoch: {}/{}.............'.format(epoch, n_epochs), end=' ')
print("Loss: {:.4f}".format(loss))
# 预测模型
predicted_tensor = predict(train_input, rnn)
# 显示结果
plt.plot(train_data[:-1], 'r', label='Training Data')
plt.plot(predicted_tensor.view(-1).detach().numpy(), 'b', label='Predicted Data')
plt.legend()
plt.show()
```
在这个代码中,我们定义了一个简单的RNN模型,用于预测正弦函数的下一个值。我们使用PyTorch来实现模型,并使用MSE损失来训练模型。在训练期间,我们记录了每个时期的损失,并在训练完成后使用训练数据来预测模型。最后,我们将预测的结果与原始数据一起显示在图中。