深度学习R4周:LSTM-火灾温度预测
- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
任务:
数据集中提供了火灾温度(Tem1)、一氧化碳浓度(CO 1)烟雾浓度(Soot 1)。随着时间变化数据,需要根据这些数据对未来某一时刻的火灾温度做出预测。
要求:
1.了解LSTM是什么,并使用其构建一个完整的程序
2.R2达到0.83
拔高:
使用第1-8个时刻的数据预测第9-10个时刻的温度数据
一、理论知识基础
1.LSTM原理
LSTM---RNN进阶版
如果RNN的最大限度是理解一句话,则LSTM的最大限度是理解一段话。
具体:
LSTM,长短期记忆网络(Long Short Term Memory networks),一种特有的RNN,能够学习到长期依赖关系。
所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中、重复模块结构非常简单,其结构如下:
LSTM避免了长期以来的问题、可以记住长期信息! LSTM内部有较为复杂的结构,能通过门控状态来选择调整传输的信息,需要长时间记忆的信息,忘记不重要的信息。

2.LSTM的数据处理流程
将时序数据(LSTM输入数据)以可视化形式呈现。



根据输入的数据结构、预测输出、程序可以分为以下六类:

3.代码实现
1.前期准备
1.1导入数据
import torch.nn.functional as F
import numpy as np
import pandas as pd
import torch
from torch import nn
数据:训练营提供
data = pd.read_csv('/PythonProject/woodpine2.csv')print(data)
结果输出:

因为过年,台式机不在身边,尝试在线代码平台。
问题:Module Not FoundError:No module named ‘torch’
这个在线平台与平常学习环境很类似,比较好上手,但还没有找到如何安装torch的正确方法。

显示已经装好torch,但实际上没有办法继续使用,还在寻找更合适的方法。
1.2数据集可视化
import matplotlib.pyplot as plt
import seaborn as snsplt.rcParams['savefig.dpi'] = 500 #图片像素
plt.rcParams['figure.dpi'] = 500 #分辨率fig, ax =plt.subplots(1,3,constrained_layout=True, figsize=(14, 3))sns.lineplot(data=data["Tem1"], ax=ax[0])
sns.lineplot(data=data["CO 1"], ax=ax[1])
sns.lineplot(data=data["Soot 1"], ax=ax[2])
plt.show()
结果输出:

dataFrame = data.iloc[:,1:]
print(dataFrame)
2.构建数据集
2.1数据集预处理
from sklearn.preprocessing import MinMaxScaler dataFrame = data.iloc[:,1:].copy()
sc = MinMaxScaler(feature_range=(0, 1)) #将数据归一化,范围是0到1for i in ['CO 1', 'Soot 1', 'Tem1']:dataFrame[i] = sc.fit_transform(dataFrame[i].values.reshape(-1, 1))print(dataFrame.shape)
2.2设置x、y
width_X = 8
width_y = 1X = []
y = []in_start = 0for _, _ in data.iterrows():in_end = in_start + width_Xout_end = in_end + width_yif out_end < len(dataFrame):X_ = np.array(dataFrame.iloc[in_start:in_end , ])y_ = np.array(dataFrame.iloc[in_end :out_end, 0])X.append(X_)y.append(y_)in_start += 1X = np.array(X)
y = np.array(y).reshape(-1,1,1)print(X.shape, y.shape)
结果输出:
2.3划分数据集
X_train = torch.tensor(np.array(X[:5000]), dtype=torch.float32)
y_train = torch.tensor(np.array(y[:5000]), dtype=torch.float32)X_test = torch.tensor(np.array(X[5000:]), dtype=torch.float32)
y_test = torch.tensor(np.array(y[5000:]), dtype=torch.float32)print(X_train.shape, y_train.shape)
结果输出:
from torch.utils.data import TensorDataset, DataLoadertrain_dl = DataLoader(TensorDataset(X_train, y_train),batch_size=64, shuffle=False)test_dl = DataLoader(TensorDataset(X_test, y_test),batch_size=64, shuffle=False)
3.模型训练
3.1构建LSTM模型
# 构建模型
class model_lstm(nn.Module): classmodel_lstm(classmodel_lstm): def __init__(self): super(model_lstm, self).__init__() self.lstm0 = nn.LSTM(input_size=3 ,hidden_size=320, num_layers=1, batch_first=True) self.lstm1 = nn.LSTM(input_size=320 ,hidden_size=320,num_layers=1, batch_first=True) self.fc0 = nn.Linear(320, 1) def forward(self, x): Defforward(self,x): out, hidden1 = self.lstm0(x) out, _ = self.lstm1(out, hidden1) out = self.fc0(out) return out[:, -1:, :] #取2个预测值,否则经过lstm会得到8*2个预测 model = model_lstm()
print(model model模型)

修改后得到
model(torch.rand(30,8,3)).shape
3.2定义训练/测试函数
# 定义训练函数
import copy
def train(train_dl, model, loss_fn, opt, lr_scheduler=None):size = len(train_dl.dataset) num_batches = len(train_dl) train_loss = 0 # 初始化训练损失和正确率for x, y in train_dl: x, y = x.to(device), y.to(device)# 计算预测误差pred = model(x) # 网络输出loss = loss_fn(pred, y) # 计算网络输出和真实值之间的差距# 反向传播opt.zero_grad() # grad属性归零loss.backward() # 反向传播opt.step() # 每一步自动更新# 记录losstrain_loss += loss.item()if lr_scheduler is not None:lr_scheduler.step()print("learning rate = {:.5f}".format(opt.param_groups[0]['lr']), end=" ")train_loss /= num_batchesreturn train_loss
# 定义测试函数
def test (dataloader, model, loss_fn): size = len(dataloader.dataset) # 测试集的大小 num_batches = len(dataloader) # 批次数目 test_loss = 0 # 当不进行训练时,停止梯度更新,节省计算内存消耗 with torch.no_grad(): for x, y in dataloader: x, y = x.to(device), y.to(device) # 计算loss y_pred = model(x) loss = loss_fn(y_pred, y) test_loss += loss.item() test_loss /= num_batches return test_loss
3.3正式训练
#设置GPU训练
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
deviceX_test = X_test.to(device)#训练模型
model = model_lstm()
model = model.to(device)
loss_fn = nn.MSELoss() # 创建损失函数
learn_rate = 1e-1 # 学习率
opt = torch.optim.SGD(model.parameters(),lr=learn_rate,weight_decay=1e-4)
epochs = 50
train_loss = []
test_loss = []
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt,epochs, last_epoch=-1) for epoch in range(epochs):model.train()epoch_train_loss = train(train_dl, model, loss_fn, opt, lr_scheduler)model.eval()epoch_test_loss = test(test_dl, model, loss_fn)train_loss.append(epoch_train_loss)test_loss.append(epoch_test_loss)template = ('Epoch:{:2d}, Train_loss:{:.5f}, Test_loss:{:.5f}')print(template.format(epoch+1, epoch_train_loss, epoch_test_loss))print("="*20, 'Done', "="*20)
让同学帮忙跑了代码,得到部分结果

4.模型评估
4.1 LOSS图
import matplotlib.pyplot as plt importmatplotlib.pyplotaspltplt.figure(figsize=(5, 3),dpi=120) 图(图大小=(5.3),dpi=120) plt.plot(train_loss , label='LSTM Training Loss') plt.plot(train_loss,Label ='LSTM训练损失')
plt.plot(test_loss, label='LSTM Validation Loss') plt.plot(test_loss,tag ="LSTM验证丢失") plt.title('Training and Validation Loss') plt.title(“培训和验证损失”)
plt.legend() legend()
plt.show() plt.show)搜索结果
4.2调用模型进行预测
# 测试集输入模型进行预测
# predicted_y_lstm = sc.inverse_transform(model(X_test).detach().numpy().reshape(-1,1))
predicted_y_lstm = sc.inverse_transform(model(X_test).detach().cpu().numpy().reshape(-1,1))
y_test_1 = sc.inverse_transform(y_test.reshape(-1,1))
y_test_one = [i[0] for i in y_test_1]
predicted_y_lstm_one = [i[0] for i in predicted_y_lstm]plt.figure(figsize=(5, 3),dpi=120)
# 画出真实数据和预测数据的对比曲线
plt.plot(y_test_one[:2000], color='red', label='real_temp')
plt.plot(predicted_y_lstm_one[:2000], color='blue', label='prediction')plt.title('Title')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
4.3R2值评估
from sklearn import metrics
"""
RMSE :均方根误差 -----> 对均方误差开方
R2 :决定系数,可以简单理解为反映模型拟合优度的重要的统计量
"""
RMSE_lstm = metrics.mean_squared_error(predicted_y_lstm_one, y_test_1)**0.5
R2_lstm = metrics.r2_score(predicted_y_lstm_one, y_test_1)print('均方根误差: %.5f' % RMSE_lstm)
print('R2: %.5f' % R2_lstm)
二、总结
这周真的很混乱,身边没有台式机,在线平台也没有想象中好用,可能是我没有找到方式。LSTM学习掌握的很一般,明天就能有台式机。重新修改学习记录。文字知识已大致掌握,还需要代码加强。
LSTM的优点:
1.解决梯度消失问题:传统的RNN在处理长序列时容易出现梯度消失的问题,导致难以训练。
2.捕捉长期依赖关系:相比传统的RNN,LSTM有更好的记忆性能,可以在处理序列数据时保留较远的上下文信息。
3.可以学习到时序特征:LSTM具有对时间的敏感性,能够学习到时序数据中的模式和特征。这使得LSTM在时间序列预测、信号处理等任务中具有优势。
LSTM的缺点:
1.计算优化
2.模型简化
3.数据增强和迁移学习
这周真是失败的一次学习打卡。。。困难多多
相关文章:
深度学习R4周:LSTM-火灾温度预测
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 任务: 数据集中提供了火灾温度(Tem1)、一氧化碳浓度(CO 1)烟雾浓度(Soot 1)…...
Datawhale 数学建模导论二 笔记1
第6章 数据处理与拟合模型 本章主要涉及到的知识点有: 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论,如果对这部分内容不熟悉,可以参考相关概率论与数理统计的…...
Go框架面试突击!30道高频题解析
前言 有粉丝朋友问我能不能整理Go主流框架方面的面试题,安排! 这篇文章分享了gRPC、GoFrame、GoZero、GoMicro、GORM、Gin等主流框架的30道面试题和详解。 需要大厂面经的朋友们也可以直接加我好友,私信我。 gRPC 1.gRPC是什么ÿ…...
从VGG到Transformer:深度神经网络层级演进对模型性能的深度解析与技术实践指南
一、技术原理(数学公式示意图) 1. 层深与模型容量关系 数学表达:根据Universal Approximation Theorem,深度网络可表达复杂函数: f ( x ) f L ( f L − 1 ( ⋯ f 1 ( x ) ) ) f(x) f_L(f_{L-1}(\cdots f_1(x))) f…...
UIView 与 CALayer 的联系和区别
今天说一下UIView 与 CALayer 一、UIView 和 CALayer 的关系 在 iOS 开发中,UIView 是用户界面的基础,它负责处理用户交互和绘制内容,而 CALayer 是 UIView 内部用于显示内容的核心图层(Layer)。每个 UIView 内部都有…...
一键安装教程
Maven 安装 右键 以管理员身份运行点击 下一步安装完成后会同步配置环境变量打开 cmd, 输入 mvn 查看mvn版本修改 maven 本地仓库地址 见图三, 本地新建文件夹,修改为你本地文件夹地址 Redis 安装 右键 以管理员身份运行点击 下一步会安装到选择的文件夹下 JAVA\R…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十二节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(TesterPresent_0x3E服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x3E服务、会话保持、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x3E服…...
李宏毅机器学习笔记:【6.Optimization、Adaptive Learning Rate】
Optimization 1.Adaptive Learning Rate2.不同的参数需要不同的学习率3.Root Mean Square4.RMSProp5.Adam6.learning rate scheduling7.warm up总结 critical point不一定是你在训练一个network时候遇到的最大的障碍。 1.Adaptive Learning Rate 也就是我们要给每个参数不同的…...
vscode使用常见问题处理合集
目录 一、使用vite创建的vue3项目,script和style首行代码不会缩进,且格式化属性字段等会换行问题 首行缩进情况如下: 属性、参数格式化换行情况如下: 解决方式: 一、使用vite创建的vue3项目,script和style首行代码不…...
【技术解析】MultiPatchFormer:多尺度时间序列预测的全新突破
今天给我大家带来一篇最新的时间序列预测论文——MultiPatchFormer。这篇论文提出了一种基于Transformer的创新模型,旨在解决时间序列预测中的关键挑战,特别是在处理多尺度时间依赖性和复杂通道间相关性时的难题。MultiPatchFormer通过引入一维卷积技术&…...
Linux内核 - 非仿生机器人之感知主控系统(协议栈)
Linux内核 - 非仿生机器人之感知主控系统(协议栈) 注:该项目为18年实习期间,参与非仿生六足机器人(Linux方案)的个人理解和积累。时至今日,再看其实仅为一套系统编程相关框架,一直为…...
Node.js 工具模块
Node.js 工具模块 引言 Node.js 是一个开源的、基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 编写服务器端代码,从而构建快速、可扩展的网络应用。在 Node.js 开发过程中,工具模块扮演着至关重要的角色。本文将详细介绍 Node.js 中常用的工具…...
【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR
未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …...
大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展
Title 题目 Brain networks and intelligence: A graph neural network based approach toresting state fMRI data 大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法 01 文献速递介绍 智力是一个复杂的构念,包含了多种认知过程。研究人员通…...
Codeforces Round 1004 (Div. 2)(A-E)
题目链接:Dashboard - Codeforces Round 1004 (Div. 2) - Codeforces A. Adjacent Digit Sums 思路 只有两种情况:n1之后没有进位,y-x1。n1之后进位(y-x-1)%90。 代码 void solve(){int x,y;cin>>x>>y;if(y-x1){cout<<…...
掌握正则表达式_模式匹配的艺术
当然,以下是《掌握正则表达式:模式匹配的艺术》文章内容,使用 Java 正则表达式,并包含丰富的代码示例: 1. 引言 1.1 正则表达式的定义与历史 正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述文本模式的强大工具。它最初由数学家 Stephen Kleene…...
Python使用OpenCV图片去水印多种方案实现
1. 前言 本文为作者学习记录,使用Python结合OpenCV,总结了几种常见的水印去除方式,简单图片去水印效果良好,但是复杂图片有点一言难尽,本文部分代码仅供参考,并不能针对所有水印通用,需要根据具…...
论文阅读2——S波段宽波束圆极化天线设计
论文结构 研究背景,基于当前天线通信的应用基础进行分析,为了适应更多的应用环境和更复杂的通信信号提出宽波束圆极化的天线设计要求,圆极化天线可以接收到任意极化的电磁波且其辐射波也可以由其他任意极化天线接收到圆极化天线的特性&#…...
【java】基本数据类型和引用数据类型
在 Java 中,数据类型分为 基本数据类型 和 引用数据类型。它们的本质区别在于存储方式和操作方式。下面我会详细解释这两种数据类型,并用通俗易懂的语言帮助你理解。 1. 基本数据类型(Primitive Data Types) 基本数据类型是 Java…...
基于角色访问控制的UML 表示02
一个用户可以成为很多角色的成员,一个角色可以有许多用户。类似地,一个角色可以有多个权限,同一个权限可以被指派给多个角色。每个会话把一个用户和可能的许多角色联系起来。一个用户在激发他或她所属角色的某些子集时,建立了一个…...
CEF132 编译指南 Linux 篇 - 获取 CEF 源代码:源码同步详解(五)
1. 引言 在完成所有必要工具的安装和配置之后,我们来到了整个 CEF 编译流程中至关重要的环节:获取 CEF 源代码。CEF 源码的获取过程需要我们特别关注同步策略和版本管理,以确保获取的代码版本正确且完整。本篇将详细指导你在 Linux 系统上获…...
Golang关于结构体组合赋值的问题
现在有一个结构体,其中一个属性组合了另外一个结构体,如下所示: type User struct {Id int64Name stringAge int64UserInfo }type UserInfo struct {Phone stringAddress string }如果要给 User 结构体的 Phone 和 Address 赋值的话&am…...
django上传文件
1、settings.py配置 # 静态文件配置 STATIC_URL /static/ STATICFILES_DIRS [BASE_DIR /static, ]上传文件 # 定义一个视图函数,该函数接收一个 request 参数 from django.shortcuts import render # 必备引入 import json from django.views.decorators.http i…...
Springboot核心:统一异常处理
概述 统一异常处理机制在 Spring Boot 应用中是非常重要的核心点,因为它带来了多个方面的优势,能够显著提升应用的质量和开发效率。 为什么要优雅的处理异常 在后端发生异常或者是请求出错时,前端通常直接显示异常信息,而且对于…...
【银河麒麟高级服务器操作系统】服务器卡死后恢复系统日志丢失-分析及处理全过程
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://document.kylinos.cn 服务器环境以及配置 【机型】 处理器ÿ…...
【deepseek api 第三方平台使用参考】
1.硅基流动 1.1硅基流动网页版使用 打开硅基流动的官网 https://siliconflow.cn/zh-cn/ 点右上角登陆 在模型广场这里找到这个deepseek的r1 注意,一定选择下面标记【671B】的,这个是满血版 这个满血版收费标准是 4块钱/百万token输入 16块钱/百万token…...
通过 VBA 在 Excel 中自动提取拼音首字母
在excel里面把表格里的中文提取拼音大写缩写怎么弄 在Excel中,如果你想提取表格中的中文字符并转换为拼音大写缩写(即每个汉字的拼音首字母的大写形式),可以通过以下步骤来实现。这项工作可以分为两个主要部分: 提取拼…...
动态规划dp_4
一.背包 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包,内层for循环遍历物品。 二.题 1. 思路:dp五部曲,思路在注释 /* dp[i]表示:到达第 i 个台阶有dp[i]种方法 状态转…...
对贵司需求的PLC触摸的远程调试的解决方案
远程监控技术解决方案 一、需求痛点分析 全球设备运维响应滞后(平均故障处理周期>72小时)客户定制化需求频繁(每月PLC程序修改需求超50次)人力成本高企(单次跨国差旅成本约$5000)多品牌PLC兼容需求&am…...
Python用PyMC3马尔可夫链蒙特卡罗MCMC对疾病症状数据贝叶斯推断
全文链接:https://tecdat.cn/?p39937 本文聚焦于马尔可夫链蒙特卡罗(MCMC)方法在贝叶斯推断中的Python实现。通过介绍MCMC的基础原理、在贝叶斯推断中的应用步骤,展示了其在解决复杂分布采样问题上的强大能力。同时,借…...
