在pytorch框架下使用LSTM预测sin函数

基于pytroch使用LSTM预测sin函数

pytorch作为近期最火的深度学习库,拥有大量的使用粉丝。本文通过实战使用pytorch库,运用长短时记忆神经网络做预测。


  1. 什么是预测
  2. LSTM
  3. Code

  1. 什么是预测

大家都希望预测未来,所以在科研各个领域预测一直是科研中绕不开的话题。大家比较熟悉的有GDP预测、股票中的预测、人口预测,在这些预测中都需要很重要的一个因素,即历史数据。最开始的预测研究集中在线性回归、组合预测等等方式。这些方法通常用有形的函数对发展趋势做拟合配对,选取一个符合历史发展趋势的函数对未来进行预测。近年来深度学习迅速发展,通过使用神经网络进行回归预测的方法几乎占据了预测这类文章。
但是,我觉得预测就是一种伪科学,事物的发展具有不确定性,我也曾看过有硕士毕业论文写事故数预测,让我大跌眼镜,事物的发展固然有特定趋势,但是各种不确定性改变着事物的发展,如果一个事物受人为干预较多的,即强随机性的事物通常不可以预测,而相对较固定的事物预测确实可以通过预测的到相对合理的结果。综上,预测这种事物大家看看就好。
如果想了解预测可以看看这个ppt个人感觉还是写的不错。
https://wenku.baidu.com/view/185f1a477dd184254b35eefdc8d376eeaeaa17c0.html)

  1. LSTM

LSTM全称 Long Short-Term Memory 是一种经典的神经网络算法。是循环神经网络RNN的一种变种,LSTM区别于RNN的地方,主要就在于它在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为cell。想了解LSTM可以看看这个博客。(https://www.cnblogs.com/wangduo/p/6773601.html)
这里写图片描述

LSTM就像神经网络界的AK47。不管我们怎么努力想用新玩意儿取代它,50年后数风流还得看它。 via:hardmaru

  1. CODE

下面附python 预测使用sin前两个数字预测下一位数的模式预测,使用了一部分别人的代码,如果涉及版权请找我删除。

# -*- coding: utf-8 -*-
"""
Created on Mon Feb  5 19:51:23 2018

@author: Maohan
"""

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt#matplotlib inline
import math
dataset=[]
for data in np.arange(0, 3, .01):
    data = math.sin(data*math.pi)
    dataset.append(data)
dataset=np.array(dataset)
dataset = dataset.astype('float32')
max_value = np.max(dataset)
min_value = np.min(dataset)
scalar = max_value - min_value
dataset = list(map(lambda x: x / scalar, dataset))



def create_dataset(dataset, look_back=3):
    dataX, dataY = [], []
    for i in range(len(dataset) - look_back):
        a = dataset[i:(i + look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return np.array(dataX), np.array(dataY)

data_X, data_Y = create_dataset(dataset)

train_size = int(len(data_X) * 0.7)
test_size = len(data_X) - train_size
train_X = data_X[:train_size]
train_Y = data_Y[:train_size]
test_X = data_X[train_size:]
test_Y = data_Y[train_size:]

import torch

train_X = train_X.reshape(-1, 1, 3)
train_Y = train_Y.reshape(-1, 1, 1)
test_X = test_X.reshape(-1, 1, 3)

train_x = torch.from_numpy(train_X)
train_y = torch.from_numpy(train_Y)
test_x = torch.from_numpy(test_X)
from torch import nn
from torch.autograd import Variable
# 定义模型
class lstm_reg(nn.Module):
    def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):
        super(lstm_reg, self).__init__()
        
        self.rnn = nn.LSTM(input_size, hidden_size, num_layers) # rnn
        self.reg = nn.Linear(hidden_size, output_size) # 回归
        
    def forward(self, x):
        x, _ = self.rnn(x) # (seq, batch, hidden)
        s, b, h = x.shape
        x = x.view(s*b, h) # 转换成线性层的输入格式
        x = self.reg(x)
        x = x.view(s, b, -1)
        return x
net = lstm_reg(3, 20)

criterion = nn.MSELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)
# 开始训练
for e in range(1000):
    var_x = Variable(train_x)
    var_y = Variable(train_y)
    # 前向传播
    out = net(var_x)
    loss = criterion(out, var_y)
    # 反向传播
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if (e + 1) % 100 == 0: # 每 100 次输出结果
        print('Epoch: {}, Loss: {:.10f}'.format(e + 1, loss.data[0]))
net = net.eval() # 转换成测试模式
data_X = data_X.reshape(-1, 1, 3)
data_X = torch.from_numpy(data_X)
var_data = Variable(data_X)
pred_test = net(var_data) # 测试集的预测结果
# 改变输出的格式
pred_test = pred_test.view(-1).data.numpy()
# 画出实际结果和预测的结果
plt.plot(pred_test, 'r', label='prediction')
plt.plot(dataset[2:], 'b', label='real')
plt.legend(loc='best')

结果
这里写图片描述

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个使用 PyTorch 框架LSTM 网络训练一条曲线,并保存训练模型的代码示例: ```python import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt # 设置随机种子,保证每次运行结果一致 torch.manual_seed(1) # 创建数据集,生成一条 sin 曲线 steps = np.linspace(0, np.pi*2, 100, dtype=np.float32) x_np = np.sin(steps) y_np = np.cos(steps) # 将数据集转化为 PyTorch 张量,并添加一个维度 x = torch.from_numpy(x_np[:, np.newaxis]) y = torch.from_numpy(y_np[:, np.newaxis]) # 定义 LSTM 网络 class LSTM(nn.Module): def __init__(self, input_size, hidden_size, output_size, num_layers): super().__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.lstm = nn.LSTM(input_size, hidden_size, num_layers) self.linear = nn.Linear(hidden_size, output_size) def forward(self, input): h0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size) c0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size) out, _ = self.lstm(input, (h0, c0)) out = self.linear(out[-1]) return out # 设置超参数 input_size = 1 hidden_size = 32 output_size = 1 num_layers = 2 learning_rate = 0.01 num_epochs = 1000 # 创建 LSTM 模型 lstm = LSTM(input_size, hidden_size, output_size, num_layers) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.Adam(lstm.parameters(), lr=learning_rate) # 开始训练 for epoch in range(num_epochs): inputs = x labels = y # 前向传播 outputs = lstm(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 100 == 0: print("Epoch [{}/{}], Loss: {:.4f}".format(epoch+1, num_epochs, loss.item())) # 保存模型 torch.save(lstm.state_dict(), 'lstm_model.ckpt') # 使用训练好的模型预测一条完整的曲线 lstm.eval() with torch.no_grad(): future = 100 pred = x[-1] preds = [] for i in range(future): pred = lstm(pred.unsqueeze(0)) preds.append(pred.squeeze().item()) pred = pred.detach() preds = np.array(preds) # 绘制预测结果 x_np = x_np.reshape(-1) y_np = y_np.reshape(-1) plt.plot(steps, y_np, 'r', label='ground truth') plt.plot(steps, x_np, 'b', label='input') plt.plot(np.arange(steps[-1]+1, steps[-1]+future+1), preds, 'g', label='prediction') plt.legend(loc='best') plt.show() ``` 以上代码将生成一条 sin 曲线,并使用 LSTM 网络进行训练和保存模型,最后使用训练好的模型预测一条完整的曲线并绘制出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值