【Week-R2】使用LSTM实现火灾预测(tf版本)
- 一、 前期准备
- 1.1 设置GPU
- 1.2 导入数据
- 1.3 数据可视化
- 二、数据预处理(构建数据集)
- 2.1 设置x、y
- 2.2 归一化
- 2.3 划分数据集
- 三、模型创建、编译、训练、得到训练结果
- 3.1 构建模型
- 3.2 编译模型
- 3.3 训练模型
- 3.4 模型评估
- 3.4.1 Loss与Accuracy图
- 3.4.2 调用模型进行预测
- 3.4.3 查看误差
- 四、其他
- 4.1 模块报错:seaborn模块导入错误
- 4.2 图片实时显示比例不对
- 4.3 什么是LSTM
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
一、 前期准备
语言环境:Python3.7.8
编译器选择:VSCode
深度学习环境:TensorFlow
数据集:本地数据集
1.1 设置GPU
本文使用CPU环境
'''
LSTM-实现火灾预测
'''
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
if gpus:
gpu0 = gpus[0]
tf.config.experimental.set_memory_growth(gpu0,true)
tf.config.set_visible_devices([gpu0],"GPU")
print("GPU: ",gpus)
else:
print("CPU:")
输出:
1.2 导入数据
下载数据集文件woodpine2.csv
到本地,使用绝对路径进行访问:
# 2.1 导入数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("D:\\jupyter notebook\\DL-100-days\\RNN\\woodpine2.csv")
print("df:", df)
输出:
1.3 数据可视化
# 3.数据可视化
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["Tem1"],ax=ax[0])
sns.lineplot(data=df["CO 1"],ax=ax[1])
sns.lineplot(data=df["Soot 1"],ax=ax[2])
plt.savefig("D:\\jupyter notebook\\DL-100-days\\RNN\\3.数据可视化.png")
#plt.show()
输出:
二、数据预处理(构建数据集)
# 二、数据预处理(构建数据集)
dataFrame = df.iloc[:,1:]
print("dataFrame:", dataFrame)
输出:
2.1 设置x、y
# 1,设置x、y
# 需要实现:使用1-8时刻段预测9时刻段,则通过下述代码做好长度的确定:
width_X = 8
width_y = 1
X = []
y = []
in_start = 0
for _,_ in df.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)
输出:
2.2 归一化
# 2,归一化
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range=(0,1))
X_scaled = sc.fit_transform(X)
print(X_scaled.shape)
X_scaled = X_scaled.reshape(len(X_scaled),width_X,3)
print(X_scaled.shape)
输出:
2.3 划分数据集
取5000之前的数据作为训练集,5000之后的数据作为验证集:
# 3,划分数据集
# 取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')
print(X_train.shape)
输出:
三、模型创建、编译、训练、得到训练结果
3.1 构建模型
通过下面代码,构建一个包含两个LSTM层和一个全连接层的LSTM模型。这个模型将接受形状为(X_train.shape[1], 3)
的输入,其中X_train.shape[1]
是时间步数,3
是每个时间步的特征数。
# 三、构建模型
import keras
from keras.models import Sequential
from keras.layers import Dense,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))
# 通过上述代码,构建了一个包含两个LSTM层和一个全连接层的LSTM模型。这个模型将接受形状为 (X_train.shape[1], 3) 的输入,其中 X_train.shape[1] 是时间步数,3 是每个时间步的特征数。
输出:
3.2 编译模型
# 四、 编译模型
model_lstm.compile(loss='mean_squared_error',
optimizer=tf.keras.optimizers.Adam(1e-3))
3.3 训练模型
history = model_lstm.fit(X_train,y_train,
epochs = 40,
batch_size = 64,
validation_data=(X_test,y_test),
validation_freq= 1)
训练输出:
3.4 模型评估
3.4.1 Loss与Accuracy图
# 六、 模型评估
# 1.Loss与Accuracy图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(5, 3),dpi=120)
plt.plot(history.history['loss'],label = 'LSTM Training Loss')
plt.plot(history.history['val_loss'],label = 'LSTM Validation Loss')
plt.title('Training and Validation Accuracy')
plt.legend()
plt.savefig("D:\\jupyter notebook\\DL-100-days\\RNN\\1.Loss与Accuracy图.png")
plt.show()
输出:
3.4.2 调用模型进行预测
# 2.调用模型进行预测
predicted_y_lstm = model_lstm.predict(X_test)
y_tset_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_tset_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.savefig("D:\\jupyter notebook\\DL-100-days\\RNN\\2.调用模型进行预测图.png")
plt.show()
输出:
3.4.3 查看误差
# 3. 查看误差
from sklearn import metrics
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)
输出:
四、其他
4.1 模块报错:seaborn模块导入错误
解决方法如下:
4.2 图片实时显示比例不对
改为保存到本地查看:【在plt.show()之前保存】
line 34:
plt.savefig("D:\\jupyter notebook\\DL-100-days\\RNN\\3.数据可视化.png")
plt.show()
line 125:
plt.savefig("D:\\jupyter notebook\\DL-100-days\\RNN\\1.Loss与Accuracy图.png")
plt.show()
line 143:
plt.savefig("D:\\jupyter notebook\\DL-100-days\\RNN\\2.调用模型进行预测图.png")
plt.show()
输出:
4.3 什么是LSTM
LSTM是一种特殊的RNN,能到学习到长期的依赖关系,可以理解为升级版的RNN。
传统的RNN在处理长序列时存在着“梯度爆炸(/梯度消失)”和“短时记忆”的问题,向RNN中加入遗忘门、输入门及输出门使得困扰RNN的问题得到了一定的解决;
关于LSTM的实现流程:(1、单输出时间步)单输入单输出、多输入单输出、多输入多输出(2、多输出时间步)单输入单输出、多输入单输出、多输入多输出;