循环神经网络-单变量序列预测详解(pytorch)

news2024/11/15 4:33:13

参考博客

文章目录

      • (1)导入所需要的包
      • (2)读取数据并展示
      • (3)数据预处理
      • (4)划分训练集和测试集
      • (5)构建RNN回归模型
      • (6)构造训练函数
      • (7)对整个数据集进行预测
      • (8)可视化展示
      • (9)MSE为评价指标

(1)导入所需要的包

import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler

(2)读取数据并展示

data_csv =pd.read_csv("data/data.csv", usecols=[1])
plt.plot(data_csv)
print(data_csv.shape)

在这里插入图片描述

(3)数据预处理

缺失值,转化成numpy.ndarray类型,转化成float类型,归一化处理

data_csv = data_csv.dropna()
dataset = data_csv.values
dataset = dataset.astype("float32")
scaler = MinMaxScaler()
dataset = scaler.fit_transform(dataset)

(4)划分训练集和测试集

用30个预测一个
1-30:31
2-31:32

94-143:144
需要注意a = [dataset[i: (i + look_back)]],而不是a = dataset[i: (i + look_back)]

look_back = 30
def create_dataset(dataset, look_back):
    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)

dataX, dataY = create_dataset(dataset, look_back)
dataX.shape,dataY.shape,type(dataX),type(dataY),dataX.dtype,dataY.dtype

在这里插入图片描述对于 dataX,它的形状为 (114, 1, 30, 1)。其中 114 表示样本数量,1 表示特征数量,30 表示历史时间步的数量,1 表示每个时间步的特征数量。

输出部分dataX和dataY的值

print(dataX[:2],dataY[:2])

在这里插入图片描述

数据集搭好之后,对数据集进行7:3的划分

train_size=int(len(dataX)*0.7)
test_size=len(dataX)-train_size

train_x=dataX[:train_size]
train_y=dataY[:train_size]

test_x=dataX[train_size:]
test_y=dataY[train_size:]

print(train_size)

在这里插入图片描述

train_x=torch.from_numpy(train_x)
train_x=train_x.squeeze(3)
train_y=torch.from_numpy(train_y)

test_x=torch.from_numpy(test_x)
test_y=torch.from_numpy(test_y)
print(train_x.shape,test_x.shape)

在这里插入图片描述
对以上代码进行解释:

  • numpy.ndarray类型的转化成Tensor类型
  • 即将 NumPy 数组 train_x 转换为 PyTorch 张量
  • 转换之后神经网络才能计算
  • sequeeze(3)是将train_x从([79,1,30,1])变为([79,1,30])
  • test_x不需要sequeeze(3)的原因是:在pytorch中,卷积池化等操作需要输入的是四维张量(样本数,时间步长,特征数,1 )**(有待考究)**test在后面没用到

(5)构建RNN回归模型

class rnn_reg(torch.nn.Module):
    def __init__(self,input_size,hidden_size,out_size=1,num_layers=2)->None:
        super(rnn_reg,self).__init__()
        self.rnn=torch.nn.RNN(input_size,hidden_size,num_layers)
        self.reg=torch.nn.Linear(hidden_size,out_size)
    
    def forward(self,x):
        x,_=self.rnn(x)
        seq,batch_size,hidden_size=x.shape
        x=x.reshape(seq*batch_size,hidden_size)
        x=self.reg(x)
        x.reshape(seq,batch_size,-1)
        return x
    
net=rnn_reg(look_back,16)
criterion=torch.nn.MSELoss()
optimizer=torch.optim.Adam(net.parameters(),lr=1e-2)

对以上代码进行解释:

  • rnn_reg 的子类,继承torch.nn.Module,用于创建自定义的神经网络模型

  • __ init__是rnn_reg 类构造函数,用于初始化模型的参数
    在这里插入图片描述

  • super(rnn_reg, self).__init__(): 调用父类 torch.nn.Module 的构造函数

  • self.rnn = torch.nn.RNN(input_size, hidden_size, num_layers): 创建了一个 RNN 层。input_size 表示输入特征的维度,hidden_size 表示隐藏状态的维度,num_layers 表示 RNN 的层数。

  • self.reg = torch.nn.Linear(hidden_size, out_size): 创建了一个线性层(全连接层),用于将 RNN 的隐藏状态映射到输出特征维度。

  • def forward(self, x): 这是 rnn_reg 类的前向传播方法。它接受输入 x,并定义了模型的前向计算过程。
    -在这里插入图片描述

  • x, _ = self.rnn(x): 将输入 x 传递给 RNN 层进行前向计算。_ 表示隐藏状态,由于这里不需要使用隐藏状态,所以用下划线 _ 进行占位。

  • seq, batch_size, hidden_size = x.shape: 获取 RNN 输出 x 的形状信息,其中 seq 表示序列长度,batch_size 表示批次大小,hidden_size 表示隐藏状态的维度。

  • x = x.reshape(seq * batch_size, hidden_size): 将 x 重塑为形状 (seq * batch_size, hidden_size),以便通过线性层进行映射。

  • x = self.reg(x): 将重塑后的 x 传递给线性层 self.reg 进行映射操作。

  • x.reshape(seq, batch_size, -1): 将输出 x 重塑为形状 (seq, batch_size, -1),以便与输入保持相同的维度。

  • return x: 返回最终的输出 x。

  • net = rnn_reg(look_back, 16): 创建了一个 rnn_reg 类的实例 net。look_back 表示输入特征的维度,16 表示隐藏状态的维度。

  • criterion = torch.nn.MSELoss(): 定义了损失函数,使用均方误差(MSE)作为损失函数。

  • optimizer = torch.optim.Adam(net.parameters(), lr=1e-2): 定义了优化器,使用 Adam 优化算法来更新模型的参数,学习率为 1e-2。

输出一下设置的模型内的一些层数的维度:

for param_tensor in net.state_dict():
    print(param_tensor,'\t',net.state_dict()[param_tensor].size())

在这里插入图片描述

(6)构造训练函数

设置训练1000次,每100次输出一次损失

running_loss=0.0
for epoch in range(1000):
    var_x=train_x
    var_y=train_y
    out=net(var_x)
    loss=criterion(out,var_y)
    running_loss+=loss.item()
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if(epoch+1)%100==0:
        print('Epoch:{},loss:{:.5f}'.format(epoch+1,running_loss/100))
        running_loss=0.0
        

在这里插入图片描述
对以上代码进行解释:

  • running_loss,用于记录每个训练周期的累计损失。
  • out=net(var_x)这个out就是红框标出的需要预测的预测值,即将输入数据 var_x 通过神经网络模型 net 进行前向传播,得到输出 out。
    在这里插入图片描述
  • loss = criterion(out, var_y): 计算模型输出 out 和目标标签 var_y 之间的损失,使用预先定义的损失函数 criterion(在代码中是均方误差)。
  • loss.item() 方法用于获取 loss 的数值(标量),然后将其加到 running_loss 上。
  • optimizer.zero_grad(): 清空优化器中之前的梯度信息,以便进行下一次的反向传播。
  • loss.backward(): 执行反向传播,计算损失函数关于模型参数的梯度。
  • optimizer.step(): 这行代码根据计算得到的梯度更新模型参数,使用优化器中定义的Adam优化算法
  • print输出平均损失

(7)对整个数据集进行预测

net = net.eval() # 转换成测试模式
data_x = dataX.reshape(-1, 1, look_back)
data_x = torch.from_numpy(data_x).to(torch.float32)
var_data = data_x
pred_test = net(var_data) # 测试集的预测结果
pred_test = pred_test.view(-1).data.numpy()

对上述代码解释:
在这里插入图片描述
在这里插入图片描述

  • data_x = torch.from_numpy(data_x).to(torch.float32): 这行代码将 NumPy 数组 data_x 转换为 PyTorch 的 Tensor 对象,并将数据类型设置为 torch.float32。这是为了与神经网络模型的数据类型匹配。
  • pred_test = pred_test.view(-1).data.numpy(): 这行代码对预测结果进行处理,首先使用 view(-1) 将输出结果展平为一维张量,然后使用 data.numpy() 将结果转换为 NumPy 数组,以便后续的分析和可视化。

(8)可视化展示

这里因为用30个预测1个,所以dataset进行了切片(总共114)

plt.plot(pred_test, 'deeppink', label='prediction')
plt.plot(dataset[look_back:], 'green', label='real')
plt.legend(loc='best')

在这里插入图片描述

(9)MSE为评价指标

这里因为用30个预测1个,所以计算MSE的也不包括前30个数据,否则没法去计算

from sklearn.metrics import mean_squared_error
MSE = mean_squared_error(dataset[look_back:], pred_test)
print(MSE)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyRecovery2024免费电脑数据恢复软件下载

easyrecovery是一款功能强大、易于使用的硬盘数据恢复软件。这款软件可以帮助用户非常方便地恢复丢失的数据。软件非常容易使用和高效的数据恢复。感兴趣的朋友们赶快来下载吧。 无论是因为意外删除、格式化、病毒感染、系统崩溃还是其他原因,该软件可以帮助您恢复…

说说集成学习的四种模型

集成学习概念 集成学习是机器学习中的一种思想,它通过多个模型的组合形成一个精度更高的模型,参与组合的 模型成为弱学习器(弱学习器)。训练时,使用训练集依次训练出这些弱学习器,对未知的样本进 行预测…

day15 DOM(1)

目录 DOM简介DOM作用能力使用场景 DOM树(文档树)DOM对象获取DOM对象根据CSS选择器来获取DOM元素其它获取DOM元素方法 操作元素内容操作元素属性 DOM简介 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model&a…

KKVIEW远程控制软件介绍

KKVIEW是一款全功能远程控制软件,可以随时随地访问家里或公司设备。KKVIEW,连接自由,KKVIEW旨在帮助用户在远程技术支持、远程办公、远程教育等领域便利的开展工作。 [主要功能] 远程桌面 一键远程显示远程桌面,一键开启远程控制&#xff0…

Linux环境下部署Tomcat(详细图文)

目录 一、下载地址 1.服务器不能联网情况下载 2.服务器能够联网 二、安装 1. Tomcat解压 2. Tomcat目录说明: 3. 重命名解压后的文件名 4. 配置环境变量 5. 修改配置文件 6.启动Tomcat 7.访问Tomcat 8. 停止Tomcat 一、下载地址 1.服务器不能联网情况下…

软考十大管理领域49个过程开展频次总结

1、仅开展一次或仅在预定义时点开展的项目管理过程 序号 过程 过程组 说明 1 制定项目章程 启动 项目章程尽量在整个项目期间保持不变 2 制订项目管理计划 计划 各种管理(程序性)计划和项目基准尽量在整个项目期间保持不变 3 规划范围管理 除规划沟通管…

读懂比特币—bitcoin代码分析(一)

最近美国 SEC 通过了比特币的 ETF申请,比特币究竟是个什么东西,从技术上来说,bitcoin 是一个点对点的电子现金系统,它可以实现分布式的记账,不依赖中心化的账务系统(比如银行,支付宝&#xff09…

线上排查问题全套命令WIP(查看日志、端口占用、磁盘、CPU等)

线上排查问题全套命令WIP(查看日志、端口占用、磁盘、CPU等) 1 查看日志 1.1 less ①less xxx.log:查看日志文件 ②less -N xxx.log:带行号查看日志 ③g:定位到文件顶部 ④G(shiftg键)&am…

AI嵌入式K210项目(15)-安全散列算法加速器

文章目录 前言一、什么是SHA256?实验原理 二、K210的安全散列算法加速器三、实验过程总结 前言 K210内置了丰富的加速器,包括神经网络处理器 (KPU),AES(高级加密加速器),APU 麦克风阵列语音数据加速计算处理器,现场可…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列? 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发,在网络上已经有很多相关资料,视频教程,我也移植了公司的一个stm32G474板卡,运行LiteOS-m L0系统。 一面看资料一面移植,遇到不少坑,当看到运行的LOGO时&#xff0…

关于ElasticSearch,你应该知道的

一、集群规划优化实践 1、基于目标数据量规划集群 在业务初期,经常被问到的问题,要几个节点的集群,内存、CPU要多大,要不要SSD? 最主要的考虑点是:你的目标存储数据量是多大?可以针对目标数据…

纯命令行在Ubuntu中安装qemu的ubuntu虚拟机,成功备忘

信息总体还算完整,有个别软件更新了名字,所以在这备忘一下 1. 验证kvm是否支持 ________________________________________________________________ $ grep vmx /proc/cpuinfo __________________________________________________________________…

vue.js安装

1:下载 Node.js 官网:https://nodejs.org/en/download 2:安装 node -v npm -v 3:配置 npm config set prefix "F:\node\node_global" npm config set cache "F:\node\node_cache" 按 win 键并输入“编辑系统环境变量”调出系统属性界面&a…

汽车微电机行业研究:预计2029年将达到188亿美元

微电机行业是技术密集型行业,其起源于欧洲的德国、瑞士等国家,发展于日本。随着改革开放,中国作为发展中国家,承接了德国、日本等发达国家的汽车微电机产业转移,技术扩散逐步向我国转移。 微特电机广泛应用于信息处理设…

5G+物联网:连接万物,重塑智慧社区,开启未来生活新纪元,助力智慧社区的革新与发展

一、5G与物联网:技术概述与基础 随着科技的飞速发展,第五代移动通信技术(5G)和物联网(IoT)已经成为当今社会的热门话题。这两项技术作为现代信息社会的核心基础设施,正深刻地改变着人们的生活和…

解决字符串类型转数字类型相加结果异常问题

js字符串类型转换数字类型有七种方法,分别是parseInt(),parseFloat(),Math.floor(),乘以数字(*1),Number(),双波浪号 (~~number),一元运算符(number&#xff…

Linux:多线程

目录 1.线程的概念 1.1线程的理解 1.2进程的理解 1.3线程如何看待进程内部的资源? 1.4进程 VS 线程 2.线程的控制 2.1线程的创建 2.2线程的等待 2.3线程的终止 2.4线程ID 2.5线程的分离 3.线程的互斥与同步 3.1相关概念 3.2互斥锁 3.2.1概念理解 3.2.2操作理解…

x-cmd pkg | aliyun - 阿里云 CLI

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 aliyun 是基于阿里云 OpenAPI 的管理工具,用于与阿里云服务交互,管理阿里云资源。 首次用户 使用 x env use aliyun 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com…

NativePHP:开发跨平台原生应用的强大工具

NativePHP 是一种创新性的技术,可以帮助开发者使用 PHP 语言构建原生应用程序。本文将介绍 NativePHP 的概念和优势,探讨其在跨平台应用开发中的应用,并提供一些使用 NativePHP 开发原生应用的最佳实践。 什么是 NativePHP? Nati…