只谈代码之用pytorch写一个经常用来测试时序模型的简单常规套路(LSTM多步迭代预测)...

本文主要是介绍只谈代码之用pytorch写一个经常用来测试时序模型的简单常规套路(LSTM多步迭代预测)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

就一句话。

不谈感情,只谈代码。

本系列的代码可以当作入门,复习,作为模板修改成自己的,都是可以的。

这个系列会长期更新下去,主要与python,机器学习,数据挖掘,tensorflow,pytorch相关,后期自己准备复习一些java,学习一些go相关也会一起分享。

一来是大家都代码实战的诉求其实是比理论多的多,总会有人在我文章下面问:有代码吗?能给份代码嘛?

说实话,很多代码给不了,也没法给,我不太喜欢这样白嫖,还是希望各位自己去做一些事情,这样才是对自身的要求和提高,也是一个程序员的素养。

二来,也算自己对一些基础的积累和巩固,尽量两天一篇,每天保持对代码的嗅觉。

今天讲的是pytorch框架下,写一个平时常用来测试的小例子,关于时间序列,模型用的最简单的LSTM,多步迭代预测~

前情提要:

【PyTorch修炼】三、先做减法,具体例子带你了解torch使用的基本套路(简单分类和时间序列预测小例子)

【PyTorch修炼】二、带你详细了解并使用Dataset以及DataLoader

【PyTorch修炼】三、先做减法,具体例子带你了解torch使用的基本套路(简单分类和时间序列预测小例子)

1. 导入我们需要用到的包,此教程 包含可视化以及模型训练和测试

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltimport torch
import torch.nn as nn

2. 对于demo,尝试模型,我们可以用自己模拟的数据或者公开数据集,这里为了方便,采用自己模拟sin函数,并可视化

x = torch.linspace(0, 999, 1000)
y = torch.sin(x*2*3.1415926/70)
plt.xlim(-5, 1005)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title("sin")
plt.plot(y.numpy(), color='#800080')
plt.show()
5ea57435f93537b8cf10934bdef760df.png

3. 分训练集和测试集,并且需要对数据进行time windows分割

# len(test):50 
train_y= y[:-70]
test_y = y[-70:]

滑窗创建数据集

def create_data_seq(seq, time_window):out = []l = len(seq)for i in range(l-time_window):x_tw = seq[i:i+time_window]y_label = seq[i+time_window:i+time_window+1]out.append((x_tw, y_label))return out
time_window = 60
train_data = create_data_seq(train_y, time_window)

4. 定义lstm模型

https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html#torch.nn.LSTM

https://pytorch.org/docs/stable/generated/torch.nn.Linear.html#torch.nn.Linear

【Deep Learning】通俗大白话详述RNN理论和LSTM理论

【Deep Learning】详细解读LSTM与GRU单元的各个公式和区别

class MyLstm(nn.Module):def __init__(self, input_size=1, hidden_size=128, out_size=1):super(MyLstm, self).__init__()self.hidden_size = hidden_sizeself.lstm = nn.LSTM(input_size=input_size, hidden_size=self.hidden_size, num_layers=1, bidirectional=False)self.linear = nn.Linear(in_features=self.hidden_size, out_features=out_size, bias=True)self.hidden_state = (torch.zeros(1, 1, self.hidden_size), torch.zeros(1, 1, self.hidden_size))def forward(self, x):out, self.hidden_state = self.lstm(x.view(len(x), 1, -1), self.hidden_state)pred = self.linear(out.view(len(x), -1))return pred[-1]

5. 训练准备工作

(1) 超参数

(2) 定义loss,优化器,实例化模型

(3) 训练模型,为了更加直观,加入对test_y的预测最终可视化

learning_rate = 0.00001
epoch = 10
multi_step = 70
model = MyLstm()
mse_loss = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, betas=(0.5,0.999))device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")model.to(device)
for i in range(epoch):for x_seq, y_label in train_data:x_seq = x_seq.to(device)y_label = y_label.to(device)model.hidden_state = (torch.zeros(1, 1, model.hidden_size).to(device), torch.zeros(1, 1, model.hidden_size).to(device))pred = model(x_seq)loss = mse_loss(y_label, pred)optimizer.zero_grad()loss.backward()optimizer.step()print(f"Epoch {i} Loss: {loss.item()}")preds = []labels = []preds = train_y[-time_window:].tolist()for j in range(multi_step):test_seq = torch.FloatTensor(preds[-time_window:]).to(device)with torch.no_grad():model.hidden_state = (torch.zeros(1, 1, model.hidden_size).to(device), torch.zeros(1, 1, model.hidden_size).to(device))preds.append(model(test_seq).item())loss = mse_loss(torch.tensor(preds[-multi_step:]), torch.tensor(test_y))print(f"Performance on test range: {loss}")plt.figure(figsize=(12,4))plt.xlim(700,999)plt.grid(True)plt.plot(y.numpy(),color='#8000ff')plt.plot(range(999-multi_step,999),preds[-multi_step:],color='#ff8000')plt.show()

结果

0a6e22e56e2b1d6e2dfca926e85bbc71.png 71a8cf5a501e2c36e737f188add823ba.png完整代码:https://github.com/chehongshu/AIwoniuche_Learning/blob/master/Pytorch_LSTM_examples/demo-timeseries.ipynb

这篇关于只谈代码之用pytorch写一个经常用来测试时序模型的简单常规套路(LSTM多步迭代预测)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412386

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求