用rnn模型预测正弦函数可视化结果
时间: 2023-12-17 10:03:11 浏览: 81
好的,以下是使用PyTorch实现RNN模型预测正弦函数并可视化结果的示例代码:
```python
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
# 生成正弦函数数据
x = np.arange(0, 100, 0.1)
y = np.sin(x)
# 将数据转化为RNN模型所需的格式
seq_len = 10
x_train = []
y_train = []
for i in range(len(x) - seq_len):
x_train.append(y[i:i+seq_len])
y_train.append(y[i+seq_len])
x_train = np.array(x_train)
y_train = np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0], seq_len, 1))
y_train = np.reshape(y_train, (y_train.shape[0], 1))
# 构建RNN模型
class RNN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(RNN, self).__init__()
self.hidden_dim = hidden_dim
self.rnn = nn.RNN(input_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x, hidden):
out, hidden = self.rnn(x, hidden)
out = self.fc(out[:, -1, :])
return out, hidden
input_dim = 1
hidden_dim = 64
output_dim = 1
model = RNN(input_dim, hidden_dim, output_dim)
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 20
hidden = None
for epoch in range(num_epochs):
inputs = torch.from_numpy(x_train).float()
targets = torch.from_numpy(y_train).float()
outputs, hidden = model(inputs, hidden)
loss = criterion(outputs, targets)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 5 == 0:
print("Epoch [{}/{}], Loss: {:.4f}".format(epoch+1, num_epochs, loss.item()))
# 预测结果
model.eval()
x_test = np.arange(0, 120, 0.1)
y_test = np.sin(x_test)
x_test = np.reshape(y_test, (len(y_test), 1))
x_test = np.reshape(x_test, (1, len(y_test), 1))
y_pred, _ = model(torch.from_numpy(x_test).float(), hidden)
y_pred = y_pred.detach().numpy()
# 可视化结果
plt.plot(x_test[0,:,0], y_test, label='Ground Truth')
plt.plot(x_test[0,:,0], y_pred[0], label='Prediction')
plt.legend()
plt.show()
```
运行上述代码可以得到正弦函数的预测结果可视化图像。
阅读全文