深度学习Week13-火灾温度预测(LSTM)

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

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

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

一句话介绍LSTM,它是RNN的进阶版,如果说RNN的最大限度是理解一句话,那么LSTM的最大限度则是理解一段话,详细介绍如下:
LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够学习到长期依赖关系。LSTM由Hochreiter & Schmidhuber (1997)提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。
所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中,重复模块结构非常简单,其结构如下:
 

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

一.前期准备工作

1.导入数据

数据地址:🔗百度网盘

import tensorflow as tf
import pandas     as pd
import numpy      as np

gpus = 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(gpus)

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

顺便先导入数据

df_1 = pd.read_csv("woodpine2.csv")
df_1.head()

 2.数据可视化

import matplotlib.pyplot as plt
import seaborn as sns

plt.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:]
print(dataFrame)

 1.设置X,y

width_X=8
width_y=2

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

X = []
y = []

in_start = 0

for _, _ in df_1.iterrows():
    in_end = in_start + width_X
    out_end = in_end + width_y

    if 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 += 1

X = np.array(X)
y = np.array(y)

print(X.shape, y.shape)

 ((5938, 24), (5938, 2))

 2.归一化

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

 (5938, 8, 3)

 3.划分数据集

取5000之前的数据为训练集,5000之后的为验证集

X_train=X_scaled[:5000]
y_train=y[:5000]

X_test=X_scaled[5000:,]
y_test=y[5000:,]

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

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))

WARNING:tensorflow:Layer lstm_8 will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU
WARNING:tensorflow:Layer lstm_9 will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU

四.模型训练

1.模型编译

#只观察loss数值,不观察准确率,所以删去metrics选项
model_lstm.compile(optimizer=tf.keras.optimizers.Adam(1e-3),
                  loss='mean_squared_error')

from tensorflow.keras.callbacks import ModelCheckpoint

ModelCheckPointer=ModelCheckpoint('best_model.h5',
                                  monitor='val_loss',
                                  save_best_only=True,
                                  save_weights_only=True,               
                )
print(X_train.shape,y_train.shape)

(5000, 8, 3) (5000, 2)

history_lstm=model_lstm.fit(X_train,y_train,
                            batch_size=64,
                            epochs=50,
                            validation_data=(X_test,y_test),
                            validation_freq=1,
                            callbacks=[ModelCheckPointer])

 然后就是训练了。和以前训练差不多,不在赘述。

五.评估

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()

2.调用方模型进行预测

model_lstm.load_weights('best_model.h5')

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]

y_test_two=[i[1] for i in y_test]
predicted_y_lstm_two=[i[1] for i in predicted_y_lstm]


fig, ax =plt.subplots(1,2,constrained_layout=True, figsize=(14, 3))
#画出第9个时间段真实数据与预测数据的对比图
ax[0].plot(y_test_one[:1000],color='red',label='真实值')
ax[0].plot(predicted_y_lstm_one[:1000],color='blue',label='预测值')

#画出第10个时间段真实数据与预测数据的对比图
ax[1].plot(y_test_two[:1000],color='red',label='真实值')
ax[1].plot(predicted_y_lstm_two[:1000],color='blue',label='预测值')

ax[0].set(xlabel='X',ylabel='Y',title='第9个时间段')
ax[1].set(xlabel='X',ylabel='Y',title='第10个时间段')

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)

 均方根误差: 6.58734
R2: 0.85471

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
深度学习是一种机器学习的方法论,通过构建多层神经网络,可以从大量数据中学习并理解复杂的模式和关系。RNN(循环神经网络)和LSTM(长短期记忆网络)是深度学习中常用的一类神经网络结构,特别适用于处理序列数据。 唐诗是中国文学的瑰宝,具有深厚的文化底蕴和艺术价值。利用深度学习中的RNN和LSTM网络原理,我们可以构建一个模型,通过学习唐诗的序列数据,实现自动生成新的唐诗。 首先,我们需要收集大量的唐诗作品作为训练数据。这些数据将被用作模型的输入,通过多层的RNN和LSTM网络逐字逐词地学习唐诗的结构和语法规律。神经网络将学习到不同的词汇和诗句的概率分布,并根据概率分布生成新的唐诗。 在训练过程中,我们可以使用反向传播算法来调整神经网络的参数,以最大限度地提高生成唐诗的质量。可以通过设置合适的超参数,例如学习率和迭代次数,来优化模型的性能。 通过进一步优化模型,我们可以使生成的唐诗更具有创新性和独特性。例如,可以引入一些文学规则和约束,以保证生成的唐诗符合一定的文学规范。此外,还可以加入一些外部的条件信息,如主题或情感,来指导生成唐诗的内容。 将这一深度学习实战项目制作成视频课程,有助于学习者理解和掌握深度学习中的RNN和LSTM网络原理。通过实际的代码演示和案例讲解,学习者可以亲自动手实践,培养实战能力。同时,视频课程还可以提供一些调优技巧和经验分享,帮助学习者在实际应用中取得良好的效果。 这个项目不仅有助于学习者的技术提升,也为文学创作提供了一种新的方式。通过深度学习生成的唐诗可以为文学创作者提供灵感和思路,也可以作为艺术创作的一种实验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛大了2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值