第R2周:Tensorflow2实现:LSTM-火灾温度预测

  • 本文为365天深度学习训练营 中的学习记录博客
  • 原作者:K同学啊

任务说明:数据集中提供了火灾温度(Tem1)、一氧化碳浓度(CO 1)、烟雾浓度(Soot 1)随着时间变化数据,我们需要根据这些数据对未来某一时刻的火灾温度做出预测

要求:
1.了解LSTM是什么,并使用其构建一个完整的程序
2.R2达到0.83

拔高:
1.使用第1 ~ 8个时刻的数据预测第9 ~ 10个时刻的温度数据

我的环境:
●语言环境:Python3.8
●编译器:Jupyter Lab
●深度学习框架:TensorFlow2.4.1
●数据:火灾温度数据集

一、理论知识基础
相关知识可以先看看上一篇文章《第R2周:LSTM-火灾温度预测:一文搞懂LSTM(长短期记忆网络)》

1.LSTM原理
一句话介绍LSTM,它是RNN的进阶版,如果说RNN的最大限度是理解一句话,那么LSTM的最大限度则是理解一段话,详细介绍如下:

LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够学习到长期依赖关系。LSTM由Hochreiter & Schmidhuber (1997)提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。

所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中,重复模块结构非常简单,其结构如下:
在这里插入图片描述

LSTM避免了长期依赖的问题。可以记住长期信息!LSTM内部有较为复杂的结构。能通过门控状态来选择调整传输的信息,记住需要长时间记忆的信息,忘记不重要的信息,其结构如下:
在这里插入图片描述
在这里插入图片描述

  1. LSTM的数据处理流程

为了更好的理解LSTM输入数据的结构,将时序数据(LSTM输入数据)以可视化的形式呈现。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

  1. 关于代码实现
    3.1. 单输入单输出(单输出时间步)
    在这里插入图片描述
    ●输入:单个特征,多个时间步
    ●输出:单个特征,单个时间步

数据案例

训练集:
X                         y
[10, 20, 30, 40, 50]      [60]
[20, 30, 40, 50, 60]      [70]
[30, 40, 50, 60, 70]      [80]
…预测输入:
X
[70, 80, 90, 100 ,110]
期待输出:
y
[120]

TensorFlow2代码实现

model = Sequential()
model.add( LSTM(50,  activation='relu',  input_shape = (n_steps, n_features)) )
model.add( Dense(1) )
model.compile(optimizer='adam', loss='mse')n_steps = 5
n_features = 1

3.2. 多输入单输出(单输出时间步)

在这里插入图片描述
●输入:多个特征,多个时间步
●输出:单个特征,单个时间步

数据案例

训练集:
X                       y
[[10,11], [20,21],[30,31],[40,41],[50,51]]               60
[[20,21],[30,31],[40,41],[50,51],[60,61]]               70
…预测输入:
X
[[30,31],[40,41],[50,51],[60,61],[70,71]]
期待输出:
y
80

TensorFlow2代码实现

model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')n_steps = 5
# 此例中 n_features = 2,因为输入有两个并行序列
n_features = X.shape[2]

3.3. 多输入多输出(单输出时间步)

在这里插入图片描述

●输入:多个特征,多个时间步
●输出:多个特征,单个时间步

数据案例

训练集:
X                       y
[[10,11], [20,21],[30,31],[40,41],[50,51]]               [60,61]
[[20,21],[30,31],[40,41],[50,51],[60,61]]               [70,71]
…预测输入:
X
[[30,31],[40,41],[50,51],[60,61],[70,71]]
期待输出:
y
[80,81]

TensorFlow2代码实现

model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')n_steps = 5
# 此例中 n_features = 2,因为输入有2个并行序列
n_features = X.shape[2]

3.4. 单输入单输出(多输出时间步)

在这里插入图片描述

●输入:单个特征,多个时间步
●输出:单个特征,多个时间步

数据案例

训练集:
X                       y
[10,20,30,40,50]       [60,70]
[20,30,40,50,60]       [70,80]
…预测输入:
X
[30,40,50,60,70]
期待输出:
y
[80,90]

TensorFlow2代码实现

model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')n_steps = 5
n_steps_out = 2
n_features = 1

多输入单输出(多输出时间步)与多输入多输出(多输出时间步)同理,这里就不赘述了

在这里插入图片描述

二、前期准备工作

  1. 导入数据
import tensorflow as tf
import pandas     as pd
import numpy      as npgpus = tf.config.list_physical_devices("GPU")
if gpus:tf.config.experimental.set_memory_growth(gpus[0], True)  #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],"GPU")print("GPU: ",gpus)
else:print('CPU:')# 确认当前可见的设备列表
print(tf.config.list_physical_devices())df_1 = pd.read_csv("./R2/woodpine2.csv")

代码输出

CPU:
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
  1. 数据可视化
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=df_1["Tem1"], ax=ax[0])
sns.lineplot(data=df_1["CO 1"], ax=ax[1])
sns.lineplot(data=df_1["Soot 1"], ax=ax[2])
plt.show()

代码输出
在这里插入图片描述

三、构建数据集

dataFrame = df_1.iloc[:,1:]
dataFrame

代码输出

Tem1CO 1Soot 1
025.00.0000000.000000
125.00.0000000.000000
225.00.0000000.000000
325.00.0000000.000000
425.00.0000000.000000
............
5943295.00.0000770.000496
5944294.00.0000770.000494
5945292.00.0000770.000491
5946291.00.0000760.000489
5947290.00.0000760.000487

5948 rows × 3 columns

  1. 设置X、y
width_X = 8
width_y = 1

取前8个时间段的Tem1、CO 1、Soot 1为X,第9个时间段的Tem1为y。

X = []
y = []in_start = 0for _, _ in df_1.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 , ])X_ = X_.reshape((len(X_)*3))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)X.shape, y.shape

代码输出

((5939, 24), (5939, 1))
  1. 归一化
from sklearn.preprocessing import MinMaxScaler#将数据归一化,范围是0到1
sc       = MinMaxScaler(feature_range=(0, 1))
X_scaled = sc.fit_transform(X)
X_scaled.shape

代码输出

(5939, 24)
X_scaled = X_scaled.reshape(len(X_scaled),width_X,3)
X_scaled.shape

代码输出

(5939, 8, 3)
  1. 划分数据集
    取5000之前的数据为训练集,5000之后的为验证集
X_train = np.array(X_scaled[:5000]).astype('float64')
y_train = np.array(y[:5000]).astype('float64')X_test  = np.array(X_scaled[5000:]).astype('float64')
y_test  = np.array(y[5000:]).astype('float64')
X_train.shape

代码输出

(5000, 8, 3)

四、构建模型

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,Bidirectional
from tensorflow.keras        import Input# 多层 LSTM
model_lstm = Sequential()
model_lstm.add(LSTM(units=64, activation='relu', return_sequences=True,input_shape=(X_train.shape[1], 3)))
model_lstm.add(LSTM(units=64, activation='relu'))model_lstm.add(Dense(width_y))

五、模型训练

  1. 编译
# 只观测loss数值,不观测准确率,所以删去metrics选项
model_lstm.compile(optimizer=tf.keras.optimizers.Adam(1e-3),loss='mean_squared_error')  # 损失函数用均方误差
  1. 训练
X_train.shape, y_train.shape

代码输出

((5000, 8, 3), (5000, 1))
history_lstm = model_lstm.fit(X_train, y_train, batch_size=64, epochs=40, validation_data=(X_test, y_test),validation_freq=1)

代码输出

Epoch 1/40
79/79 [==============================] - 3s 13ms/step - loss: 17642.7640 - val_loss: 5843.1167
Epoch 2/40
79/79 [==============================] - 1s 9ms/step - loss: 421.8025 - val_loss: 863.2029
Epoch 3/40
79/79 [==============================] - 1s 9ms/step - loss: 68.0383 - val_loss: 443.3524
Epoch 4/40
79/79 [==============================] - 1s 11ms/step - loss: 63.1070 - val_loss: 630.0569
Epoch 5/40
79/79 [==============================] - 1s 9ms/step - loss: 60.8359 - val_loss: 429.6816
Epoch 6/40
79/79 [==============================] - 1s 9ms/step - loss: 55.2357 - val_loss: 332.5534
Epoch 7/40
79/79 [==============================] - 1s 9ms/step - loss: 52.6763 - val_loss: 225.5500
Epoch 8/40
79/79 [==============================] - 1s 9ms/step - loss: 50.2085 - val_loss: 233.0096
Epoch 9/40
79/79 [==============================] - 1s 9ms/step - loss: 48.3704 - val_loss: 200.6572
Epoch 10/40
79/79 [==============================] - 1s 9ms/step - loss: 43.5778 - val_loss: 255.6778
Epoch 11/40
79/79 [==============================] - 1s 9ms/step - loss: 41.6273 - val_loss: 187.6802
Epoch 12/40
79/79 [==============================] - 1s 9ms/step - loss: 37.9668 - val_loss: 152.1306
Epoch 13/40
79/79 [==============================] - 1s 9ms/step - loss: 33.7161 - val_loss: 126.5226
Epoch 14/40
79/79 [==============================] - 1s 9ms/step - loss: 29.3218 - val_loss: 99.1449
Epoch 15/40
79/79 [==============================] - 1s 9ms/step - loss: 27.9880 - val_loss: 91.9206
Epoch 16/40
79/79 [==============================] - 1s 9ms/step - loss: 25.1793 - val_loss: 104.4199
Epoch 17/40
79/79 [==============================] - 1s 9ms/step - loss: 23.2140 - val_loss: 68.4278
Epoch 18/40
79/79 [==============================] - 1s 9ms/step - loss: 20.5209 - val_loss: 58.7139
Epoch 19/40
79/79 [==============================] - 1s 9ms/step - loss: 18.9439 - val_loss: 57.1808
Epoch 20/40
79/79 [==============================] - 1s 9ms/step - loss: 18.0535 - val_loss: 65.7030
Epoch 21/40
79/79 [==============================] - 1s 9ms/step - loss: 16.9911 - val_loss: 50.8789
Epoch 22/40
79/79 [==============================] - 1s 9ms/step - loss: 15.8952 - val_loss: 62.8621
Epoch 23/40
79/79 [==============================] - 1s 9ms/step - loss: 15.9065 - val_loss: 71.4229
Epoch 24/40
79/79 [==============================] - 1s 9ms/step - loss: 9.7059 - val_loss: 60.4816
Epoch 25/40
79/79 [==============================] - 1s 11ms/step - loss: 8.4736 - val_loss: 55.1349
Epoch 26/40
79/79 [==============================] - 1s 9ms/step - loss: 8.2527 - val_loss: 47.9371
Epoch 27/40
79/79 [==============================] - 1s 9ms/step - loss: 8.6649 - val_loss: 78.6073
Epoch 28/40
79/79 [==============================] - 1s 9ms/step - loss: 8.9457 - val_loss: 95.0485
Epoch 29/40
79/79 [==============================] - 1s 9ms/step - loss: 8.2558 - val_loss: 73.9929
Epoch 30/40
79/79 [==============================] - 1s 9ms/step - loss: 8.6800 - val_loss: 46.4249
Epoch 31/40
79/79 [==============================] - 1s 9ms/step - loss: 7.4052 - val_loss: 51.3766
Epoch 32/40
79/79 [==============================] - 1s 11ms/step - loss: 8.3682 - val_loss: 47.5709
Epoch 33/40
79/79 [==============================] - 1s 10ms/step - loss: 9.4248 - val_loss: 47.8780
Epoch 34/40
79/79 [==============================] - 1s 11ms/step - loss: 9.0760 - val_loss: 61.7005
Epoch 35/40
79/79 [==============================] - 1s 10ms/step - loss: 6.7884 - val_loss: 71.0755
Epoch 36/40
79/79 [==============================] - 1s 10ms/step - loss: 7.3383 - val_loss: 47.5915
Epoch 37/40
79/79 [==============================] - 1s 11ms/step - loss: 7.7409 - val_loss: 63.6706
Epoch 38/40
79/79 [==============================] - 1s 12ms/step - loss: 6.7351 - val_loss: 44.5680
Epoch 39/40
79/79 [==============================] - 1s 12ms/step - loss: 6.0092 - val_loss: 59.0267
Epoch 40/40
79/79 [==============================] - 1s 11ms/step - loss: 7.3467 - val_loss: 50.5237

六、评估

  1. loss图
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号plt.figure(figsize=(5, 3),dpi=120)plt.plot(history_lstm.history['loss']    , label='LSTM Training Loss')
plt.plot(history_lstm.history['val_loss'], label='LSTM Validation Loss')plt.title('Training and Validation Loss')
plt.legend()
plt.show()

代码输出

在这里插入图片描述

  1. 调用模型进行预测
predicted_y_lstm = model_lstm.predict(X_test)                        # 测试集输入模型进行预测y_test_one = [i[0] for i in y_test]
predicted_y_lstm_one = [i[0] for i in predicted_y_lstm]plt.figure(figsize=(5, 3),dpi=120)
# 画出真实数据和预测数据的对比曲线
plt.plot(y_test_one[:1000], color='red', label='真实值')
plt.plot(predicted_y_lstm_one[:1000], color='blue', label='预测值')plt.title('Title')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

代码输出
在这里插入图片描述

from sklearn import metrics
"""
RMSE :均方根误差  ----->  对均方误差开方
R2   :决定系数,可以简单理解为反映模型拟合优度的重要的统计量
"""
RMSE_lstm  = metrics.mean_squared_error(predicted_y_lstm, y_test)**0.5
R2_lstm    = metrics.r2_score(predicted_y_lstm, y_test)print('均方根误差: %.5f' % RMSE_lstm)
print('R2: %.5f' % R2_lstm)

代码输出

均方根误差: 7.10801
R2: 0.82670

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flip PDF Plus Corporate v7.1.25 激活版下载及安装步骤 (PDF电子书翻页)

前言 Flip PDF Plus Corporate 是一款功能强大的PDF翻页工具&#xff0c;也被称为名编辑电子杂志大师。它能够快速将PDF文件转换成具有翻页动画效果的电子书&#xff0c;同时保留原始的超链接和书签。该工具支持将相册、视频、音频、Flash、YouTube视频和链接等内容完全嵌入到…

OpenGL入门一:基础知识及概念

1、什么是OpenGL OpenGL&#xff1a;open graphic library&#xff0c;即开发图形库。它被定义为“图形硬件的一种软件接口”。实质上是3D图形和模型库&#xff0c;它具有高度可移植性&#xff0c;并且具有非常快的速度。可以创建优雅漂亮的3D图形&#xff0c;具有出色的视觉质…

vue3实现video视频+弹幕评论

vue3实现视频加评论 之前写了一篇博客使用了弹幕插件http://t.csdnimg.cn/616mlvue3 使用弹幕插件&#xff0c;今天对这个页面进行了升级 变成了 vue3使用video 这个没有使用插件&#xff0c;昨天看了好多&#xff0c;没发现有用的插件&#xff0c;下载了几个都没办法使用就用…

Linux C++ 多线程编程

Linux C 多线程编程 参考教程&#xff1a; c&#xff1a;互斥锁/多线程的创建和unique_lock&#xff1c;mutex&#xff1e;的使用_mutex 头文件 vcCSDN博客 1. 编写unique_mutex 1.1 创建文件夹 通过终端创建一个名为unique_mutex的文件夹以保存我们的VSCode项目&#xff…

基于HTML弹性布局做的支付宝界面

里面有一些语言图标&#xff0c;想用的可以去iconfont-阿里巴巴矢量图标库里面寻找&#xff0c;这类图标跟文字一样可以设置大小、文本居中之类的&#xff0c;并不算严格意义上的图片&#xff0c;废话不多说&#xff0c;直接上成果和代码 <!DOCTYPE html> <html lang&…

C语言程序设计-[14] 循环结构的一些应用(续)

1、求n! 。 对于这个问题&#xff0c;首先分析四个要素如下&#xff1a; 循环初始化条件&#xff1a;i1; fact1; //n!1*2*3*...*n&#xff0c;从这个问题来看&#xff0c;首先需要乘起来的数有n个&#xff0c;第一个即i1&#xff0c;然后需要fact来存储乘起来的数(初始时fac…

SpringBoot下载resources目录下的文件

1.引入SpringBoot和hutool依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.22</version></dependency>2.在项目resources目录下放入模版文件&#xff0c;结构如下&#xff1a…

【学习笔记】解决在声音输出中找不到蓝牙耳机设备的问题

【学习笔记】在声音输出中找不到蓝牙耳机设备 在使用蓝牙耳机的时候&#xff0c;遇见一个问题&#xff0c;就是在电脑在连接蓝牙耳机之后&#xff0c;在声音输出中找不到蓝牙耳机设备&#xff0c;只能使用扬声器播放声音。电脑使用的是Windows 11系统。后来在网上寻找解决方案…

使用MAC电脑、iPhone 真机调试 H5页面

使用MAC电脑、iPhone 真机调试 H5页面 简介Safari 浏览器设置iPhone 手机设置开始调试 简介 为方便在 H5开发过程中在真实手机调试 H5页面&#xff0c;可进行一下设置 Safari 浏览器设置 在 Mac 电脑打开浏览器后&#xff0c;点左上角的" Safari 浏览器" -> “设…

LVS详细配置

目录 LVS简介 LVS集群体系结构 LVS相关术语 lvs集群的类型 1、NAT模式 NAT简介 NAT模式数据逻辑 2、DR模式 DR模式简介 DR模式数据逻辑 DR模式的特点 3、TUN模式 TUN模式简介 TUN模式数据传输过程 TUN模式特点 4、fullnet模式 LVS模式总结 LVS调度算法 LVS静…

每天五分钟深度学习pytorch:训练神经网络模型的基本步骤

本文重点 本文个人认为是本专栏最重要的章节内容之一,前面我们学习了pytorch中的基本数据tensor,后面我们就将学学习深度学习模型的内容了,在学习之前,我们先来看一下我们使用pytorch框架训练神经网络模型的基本步骤,然后我们下面就将这些步骤分解开来,详细学习。 代码…

力扣第45题:跳跃游戏 贪心DP(C++)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

途博V16 g110m,g120,g120c,g120d未安装(已解决)

官网下载驱动并安装就行&#xff0c;安装流程和安装软件本体的流程一样&#xff0c; 驱动下载地址&#xff1a; SIOS 安装流程参考&#xff1a;博途V16软件官方下载和安装_博途软件怎么从官网下载-CSDN博客

Python之布尔(逻辑)运算符:and、or、not

这是《Python入门经典以解决计算问题为导向的Python编程实践》65-73页的内容&#xff0c;是对上一篇内容的补充&#xff0c;主要讲了布尔运算符。 深入控制语句 1、布尔变量2、关系运算符3、布尔运算符&#xff08;逻辑运算符&#xff09;4、优先级自测练习 1、布尔变量 布尔…

Node.js是什么?如何安装

目录 一、前言 1、JavaScript语言-----前端开发 2、JavaScript语言-----后端开发 总结&#xff1a;如果我们写了一段 js 代码&#xff0c;把他放到浏览器中执行&#xff0c;是在做前端开发&#xff1b;如果放在Node.js下运行&#xff0c;是在做后端开发。 二、安装 1、打开…

如何学习一门编程语言?

“好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 如何学习一门编程语言&#xff1f; 如何学习一门编程语言&#xff1f;1.做好笔记2.保证充足的学习时间和练习时间。不能超过三天断学。会遗忘和变得懒散。明确学习的目标 3.学习顺序进入基础部分不…

string详解(1)

1.C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&…

地接侠小程序(Taro)兼容IOS系统Bug解决(redux持久化不成功、整个页面会拖动)

在写地接侠小程序的时候就是有考虑过兼容问题的&#xff0c;但是在写的过程中并没有用苹果手机进行调式&#xff0c;一直都是用的自己的安卓手机&#xff0c;一直都是没有问题的&#xff0c;但是毕竟项目需要上线&#xff0c;于是在上线前用苹果手机测试果然出现了预想中的问题…

确保线程安全:深入理解.Net开发中 `Control.InvokeRequired` 属性

1. 前言 在 .NET 开发中&#xff0c;特别是在 Windows 窗体应用程序中&#xff0c;多线程编程是一个常见的需求。为了确保界面的稳定性和响应性&#xff0c;需要掌握如何在不同线程之间安全地进行操作。在本文中&#xff0c;我们将深入探讨 Control.InvokeRequired 属性&#x…

Windows--WSL2--Ubuntuon--Docker

编写目的&#xff1a; 在Windows上安装Docker&#xff0c;用Docker安装Gitlab、Jenkins等软件。 文章记录一下Windows上安装Docker的过程。 参考文档&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 下面用"参考文档"代替 目录 第一步&#xff1a;启…