当前位置: 首页 > news >正文

第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客**
>- **🍖 原作者:[K同学啊]**

往期文章可查阅: 深度学习总结

任务说明:数据集中提供了火灾温度(Tem1)、一氧化碳浓度(CO 1)、烟雾浓度(Soot 1)随着时间变化数据,我们需要根据这些数据对未来某一时刻的火灾温度做出预测
🍺要求:
1、了解LSTM是什么,并使用其构建一个完整的程序。
2、R2达到0.83
🍻拔高:
使用第1~8个时刻的数据 预测第9~10个时刻的温度数据。

🚀我的环境:

  • 语言环境:Python3.11.7
  • 编译器:jupyter notebook
  • 深度学习框架:TensorFlow2.13.0

一、理论知识基础

1. LSTM原理

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

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

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

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

2. LSTM的数据处理流程

 为了更好的理解SLTM输入数据的结构,将时序数据(LSTM输入数据)以可视化的形式呈现。

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

二、前期准备工作

1. 导入数据

打开数据集看到如下图所示:

其中数据集里面的每列的标签含义为:

  • Time:时间
  • Tem1:火灾温度
  • CO 1:一氧化碳浓度
  • Soot 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(gpus)df_1=pd.read_csv("D:\THE MNIST DATABASE\RNN\R4\woodpine2.csv")
print(df_1.head())

代码输出:

[]Time  Tem1  CO 1  Soot 1
0  0.000  25.0   0.0     0.0
1  0.228  25.0   0.0     0.0
2  0.456  25.0   0.0     0.0
3  0.685  25.0   0.0     0.0
4  0.913  25.0   0.0     0.0

由于我的电脑没有安装GPU版本的TensorFlow,故显示"[]"。

同时,读取一个名为"woodpine2.csv"的文件,并将其存储在一个名为df_1的pandas DataFrame中。然后,它打印出这个DataFrame的前几行。

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

运行结果:

使用matplotlib和seaborn库创建了三个并排的折线图。

1. `plt.rcParams['savefig.dpi'] = 500`:这行代码设置保存图像时的分辨率,即每英寸的像素数。如果你将绘制的图像保存为图片文件(比如PNG格式),它的分辨率将是500 DPI。

2. `plt.rcParams['figure.dpi'] = 500`:这行代码设置绘制图像时的分辨率,默认情况下图像在屏幕或笔记本中显示的效果。较高的分辨率值会使图像显示更加清晰和细节丰富。

3. `fig, ax = plt.subplots(1, 3, constrained_layout=True, figsize=(14, 3))`:创建一个图形对象和三个子图(坐标轴),子图按照一行三列的方式排列。`fig` 是图形对象,`ax` 是一个包含三个子图坐标轴的数组,每个子图用于显示一个折线图。`constrained_layout=True`选项确保子图之间的间距合适,不会重叠。 

4. `sns.lineplot(data=df_1["Tem1"], ax=ax[0])`:创建"Tem1"列的折线图,数据来自DataFrame `df_1`。折线图被放置在第一个子图(`ax[0]`)中。`sns.lineplot`是seaborn库中简化绘制折线图的函数。

5. `sns.lineplot(data=df_1["CO 1"], ax=ax[1])`:创建"CO 1"列的折线图,数据同样来自DataFrame `df_1`。折线图被放置在第二个子图(`ax[1]`)中。

6. `sns.lineplot(data=df_1["Soot 1"], ax=ax[2])`:这行代码创建了"Soot 1"列的折线图,数据同样来自DataFrame `df_1`。折线图被放置在第三个子图(`ax[2]`)中。

三、构建数据集

 是从 `df_1` DataFrame 中选取所有行和从第二列开始的所有列,然后将结果赋值给一个新的 DataFrame 变量 `dataFrame`。

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

运行结果:

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(dataFram):x_=np.array(dataFram.iloc[in_start:in_end, ])x_=x_.reshape((len(x_)*3))y_=np.array(dataFram.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

for _, _ in df_1.iterrows():: 此循环遍历了 df_1 中的每一行数据。但是在代码中并没有使用循环中的变量 _,这意味着这个循环仅仅用于迭代,而没有在循环体内使用行的具体数据。 

运行结果:

((5939, 24), (5939, 1))

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.shape: 这行代码打印出 X_scaled 数组的形状。x_scaled 是缩放后的特征矩阵,其形状为 (样本数, 特征数)


x_scaled=x_scaled.reshape(len(x_scaled),width_x,3)
x_scaled.shape

运行结果:

(5939, 8, 3)

 x_scaled = x_scaled.reshape(len(x_scaled), width_x, 3): 这行代码对 x_scaled 进行了 reshape 操作。reshape 函数用于改变数组的形状。在这里,将 x_scaled 数组的形状改为 (样本数, width_x, 3)。width_x 是输入窗口的宽度,而 3 是每个时间步包含的特征数。

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')
x_train.shape

运行结果:

(5000, 8, 3)

四、构建模型

使用 TensorFlow 中的 Keras API 来构建一个 LSTM(长短期记忆网络)模型

LSTM模型的参数:

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

 构建了一个 LSTM 模型,其中包含两个 LSTM 层和一个 Dense 输出层。LSTM 层用于处理时间序列数据,`return_sequences=True` 设置确保中间的 LSTM 层输出也是一个时间序列,而不仅仅是最后一个时间步的输出。最后的 Dense 层输出预测目标的结果。

1. `from tensorflow.keras.models import Sequential`: 导入 Keras 中的 Sequential 模型类,它允许我们按照顺序将各种层叠加起来构建神经网络。

2. `from tensorflow.keras.layers import Dense, LSTM, Bidirectional`: 导入 Keras 中的 Dense 层(全连接层)、LSTM 层(长短期记忆层)和 Bidirectional 层(双向 LSTM 层)。

3. `from tensorflow.keras import Input`: 导入 Keras 中的 Input 类,用于指定输入数据的形状。

4. `model_lstm = Sequential()`: 创建一个空的 Sequential 模型对象 `model_lstm`。

5. `model_lstm.add(LSTM(units=64, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], 3)))`: 向模型中添加一个 LSTM 层。

   - `units=64`: 表示 LSTM 层中有 64 个神经元。
   - `activation='relu'`: 表示 LSTM 层使用 ReLU(Rectified Linear Unit)激活函数。
   - `return_sequences=True`: 表示 LSTM 层的输出将作为下一个 LSTM 层的输入,而不是仅返回最后一个时间步的输出。
   - `input_shape=(X_train.shape[1], 3)`: 指定输入数据的形状。`X_train` 是输入数据的训练集,它的形状为 `(样本数, 时间步数, 特征数)`,在这里 `X_train.shape[1]` 表示时间步数,而 `3` 表示每个时间步的特征数。

6. `model_lstm.add(LSTM(units=64, activation='relu'))`: 向模型中再添加一个 LSTM 层。

   - `units=64`: 表示 LSTM 层中有 64 个神经元。
   - `activation='relu'`: 表示 LSTM 层使用 ReLU(Rectified Linear Unit)激活函数。

7. `model_lstm.add(Dense(width_y))`: 向模型中添加一个 Dense 层。

   - `width_y`: 这是一个之前定义的变量,表示预测目标的宽度,也就是需要预测的时间步数。
   - 这个 Dense 层用于输出最终的预测结果,因此它的神经元数等于 `width_y`,并且没有指定激活函数,即默认为线性激活函数。

五、模型训练

1. 编译

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

2. 训练

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 11ms/step - loss: 10764.3506 - val_loss: 9891.9375
Epoch 2/40
79/79 [==============================] - 1s 7ms/step - loss: 253.9480 - val_loss: 1172.7687
Epoch 3/40
79/79 [==============================] - 1s 7ms/step - loss: 70.3796 - val_loss: 668.7833
Epoch 4/40
79/79 [==============================] - 1s 7ms/step - loss: 64.9149 - val_loss: 481.6623
Epoch 5/40
79/79 [==============================] - 1s 7ms/step - loss: 54.8473 - val_loss: 336.6349
Epoch 6/40
79/79 [==============================] - 1s 7ms/step - loss: 14.0086 - val_loss: 182.0771
Epoch 7/40
79/79 [==============================] - 1s 7ms/step - loss: 7.8964 - val_loss: 123.3019
Epoch 8/40
79/79 [==============================] - 1s 7ms/step - loss: 7.9218 - val_loss: 139.7560
Epoch 9/40
79/79 [==============================] - 1s 7ms/step - loss: 7.6670 - val_loss: 114.2544
Epoch 10/40
79/79 [==============================] - 1s 7ms/step - loss: 7.9219 - val_loss: 135.5925
Epoch 11/40
79/79 [==============================] - 1s 7ms/step - loss: 7.6049 - val_loss: 174.2708
Epoch 12/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5125 - val_loss: 154.6042
Epoch 13/40
79/79 [==============================] - 1s 7ms/step - loss: 8.3222 - val_loss: 111.5982
Epoch 14/40
79/79 [==============================] - 1s 7ms/step - loss: 8.0469 - val_loss: 157.4362
Epoch 15/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4982 - val_loss: 127.7658
Epoch 16/40
79/79 [==============================] - 1s 7ms/step - loss: 7.1061 - val_loss: 146.1830
Epoch 17/40
79/79 [==============================] - 1s 7ms/step - loss: 7.1750 - val_loss: 156.5059
Epoch 18/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5197 - val_loss: 101.5926
Epoch 19/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2387 - val_loss: 117.7334
Epoch 20/40
79/79 [==============================] - 1s 7ms/step - loss: 7.3422 - val_loss: 105.7751
Epoch 21/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2852 - val_loss: 116.7700
Epoch 22/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4932 - val_loss: 136.8479
Epoch 23/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4134 - val_loss: 98.3815
Epoch 24/40
79/79 [==============================] - 1s 7ms/step - loss: 7.6605 - val_loss: 112.9966
Epoch 25/40
79/79 [==============================] - 1s 7ms/step - loss: 6.9967 - val_loss: 135.6190
Epoch 26/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2674 - val_loss: 131.4203
Epoch 27/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2850 - val_loss: 105.6638
Epoch 28/40
79/79 [==============================] - 1s 7ms/step - loss: 7.3508 - val_loss: 107.9184
Epoch 29/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5499 - val_loss: 129.0708
Epoch 30/40
79/79 [==============================] - 1s 7ms/step - loss: 6.9623 - val_loss: 99.9334
Epoch 31/40
79/79 [==============================] - 1s 7ms/step - loss: 7.1018 - val_loss: 139.2192
Epoch 32/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4560 - val_loss: 97.3027
Epoch 33/40
79/79 [==============================] - 1s 7ms/step - loss: 7.7134 - val_loss: 92.7316
Epoch 34/40
79/79 [==============================] - 1s 7ms/step - loss: 7.0855 - val_loss: 196.1367
Epoch 35/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2137 - val_loss: 176.6974
Epoch 36/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2358 - val_loss: 119.6593
Epoch 37/40
79/79 [==============================] - 1s 7ms/step - loss: 8.9363 - val_loss: 81.6089
Epoch 38/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5995 - val_loss: 72.8987
Epoch 39/40
79/79 [==============================] - 1s 7ms/step - loss: 7.8327 - val_loss: 85.2255
Epoch 40/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2542 - val_loss: 114.3509

五、评估

1. loss图

# 支持中文
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号plt.figure(figsize=(5,3),dpi=300)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. 调用模型进行预测

# 测试集输入模型进行预测
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=500)
# 画出真实数据和预测数据的对比曲线
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()

运行结果:

30/30 [==============================] - 0s 2ms/step

3. 均方根误差和R2 

from sklearn import metrics
"""
RMSE:均方根误差 ----->  %ddir均方误差开方
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)

运行结果:

均方根误差:10.69350
R2:0.74156

RMSE均方根误差是预测值与真实值的误差平方根的均值,它用来估计模型预测目标值的性能(准确度),值越小,模型的质量越好。

R2是将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间。0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况,值越接近1,模型的质量越好。

六、心得体会

在本项目中体会了LSTM模型的建立过程。同时,修改参数,将batch_size调整为32,epochs调整为50,得到结果如下:

Epoch 1/50
157/157 [==============================] - 4s 7ms/step - loss: 5803.9741 - val_loss: 997.3257
Epoch 2/50
157/157 [==============================] - 1s 5ms/step - loss: 58.7955 - val_loss: 524.5692
Epoch 3/50
157/157 [==============================] - 1s 5ms/step - loss: 14.5207 - val_loss: 225.7290
Epoch 4/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3101 - val_loss: 253.0079
Epoch 5/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3271 - val_loss: 452.0248
Epoch 6/50
157/157 [==============================] - 1s 5ms/step - loss: 9.2289 - val_loss: 173.1531
Epoch 7/50
157/157 [==============================] - 1s 5ms/step - loss: 8.8041 - val_loss: 198.9779
Epoch 8/50
157/157 [==============================] - 1s 5ms/step - loss: 8.7300 - val_loss: 175.1857
Epoch 9/50
157/157 [==============================] - 1s 5ms/step - loss: 8.8531 - val_loss: 171.3546
Epoch 10/50
157/157 [==============================] - 1s 5ms/step - loss: 9.1017 - val_loss: 247.7276
Epoch 11/50
157/157 [==============================] - 1s 5ms/step - loss: 9.0273 - val_loss: 146.3507
Epoch 12/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3682 - val_loss: 264.0306
Epoch 13/50
157/157 [==============================] - 1s 5ms/step - loss: 7.8832 - val_loss: 145.7737
Epoch 14/50
157/157 [==============================] - 1s 5ms/step - loss: 8.3341 - val_loss: 132.9032
Epoch 15/50
157/157 [==============================] - 1s 5ms/step - loss: 7.9307 - val_loss: 120.7632
Epoch 16/50
157/157 [==============================] - 1s 5ms/step - loss: 7.2120 - val_loss: 144.6875
Epoch 17/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3120 - val_loss: 118.4922
Epoch 18/50
157/157 [==============================] - 1s 5ms/step - loss: 8.1260 - val_loss: 98.8698
Epoch 19/50
157/157 [==============================] - 1s 5ms/step - loss: 11.0811 - val_loss: 175.3161
Epoch 20/50
157/157 [==============================] - 1s 5ms/step - loss: 8.7360 - val_loss: 123.1096
Epoch 21/50
157/157 [==============================] - 1s 5ms/step - loss: 11.2534 - val_loss: 240.5431
Epoch 22/50
157/157 [==============================] - 1s 5ms/step - loss: 7.6774 - val_loss: 155.3054
Epoch 23/50
157/157 [==============================] - 1s 5ms/step - loss: 8.0887 - val_loss: 134.8892
Epoch 24/50
157/157 [==============================] - 1s 5ms/step - loss: 7.4270 - val_loss: 111.8976
Epoch 25/50
157/157 [==============================] - 1s 5ms/step - loss: 6.3537 - val_loss: 146.3686
Epoch 26/50
157/157 [==============================] - 1s 5ms/step - loss: 10.4478 - val_loss: 97.9665
Epoch 27/50
157/157 [==============================] - 1s 5ms/step - loss: 9.7261 - val_loss: 188.2359
Epoch 28/50
157/157 [==============================] - 1s 5ms/step - loss: 10.1440 - val_loss: 110.3858
Epoch 29/50
157/157 [==============================] - 1s 5ms/step - loss: 8.5073 - val_loss: 130.2033
Epoch 30/50
157/157 [==============================] - 1s 5ms/step - loss: 7.0013 - val_loss: 74.1561
Epoch 31/50
157/157 [==============================] - 1s 5ms/step - loss: 14.6065 - val_loss: 103.0083
Epoch 32/50
157/157 [==============================] - 1s 5ms/step - loss: 8.0986 - val_loss: 146.9292
Epoch 33/50
157/157 [==============================] - 1s 5ms/step - loss: 7.1963 - val_loss: 121.0111
Epoch 34/50
157/157 [==============================] - 1s 5ms/step - loss: 8.1757 - val_loss: 109.8830
Epoch 35/50
157/157 [==============================] - 1s 5ms/step - loss: 14.4749 - val_loss: 85.2331
Epoch 36/50
157/157 [==============================] - 1s 5ms/step - loss: 7.6397 - val_loss: 87.5315
Epoch 37/50
157/157 [==============================] - 1s 5ms/step - loss: 8.1814 - val_loss: 71.4447
Epoch 38/50
157/157 [==============================] - 1s 5ms/step - loss: 7.5729 - val_loss: 75.2255
Epoch 39/50
157/157 [==============================] - 1s 5ms/step - loss: 6.2785 - val_loss: 59.0330
Epoch 40/50
157/157 [==============================] - 1s 5ms/step - loss: 8.7710 - val_loss: 68.6848
Epoch 41/50
157/157 [==============================] - 1s 5ms/step - loss: 6.9357 - val_loss: 59.7141
Epoch 42/50
157/157 [==============================] - 1s 5ms/step - loss: 7.9186 - val_loss: 65.5545
Epoch 43/50
157/157 [==============================] - 1s 5ms/step - loss: 7.6705 - val_loss: 64.9584
Epoch 44/50
157/157 [==============================] - 1s 5ms/step - loss: 8.2532 - val_loss: 71.9482
Epoch 45/50
157/157 [==============================] - 1s 5ms/step - loss: 8.5755 - val_loss: 66.6713
Epoch 46/50
157/157 [==============================] - 1s 5ms/step - loss: 7.4758 - val_loss: 93.9396
Epoch 47/50
157/157 [==============================] - 1s 5ms/step - loss: 7.3627 - val_loss: 62.4031
Epoch 48/50
157/157 [==============================] - 1s 5ms/step - loss: 7.2103 - val_loss: 55.2000
Epoch 49/50
157/157 [==============================] - 1s 5ms/step - loss: 7.1437 - val_loss: 133.6639
Epoch 50/50
157/157 [==============================] - 1s 5ms/step - loss: 7.1917 - val_loss: 64.8279

loss图结果如下:

模型预测结果为:

 均方根误差和R2值为:

均方根误差:8.05158
R2:0.83787

通过调整,减小了均方根误差的同时提升了R2值的结果。

相关文章:

第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…...

OpenCV相机标定与3D重建(5)鱼眼镜头畸变校正的函数estimateNewCameraMatrixForUndistortRectify()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 估计用于去畸变或校正的新相机内参矩阵。 cv::fisheye::estimateNewCameraMatrixForUndistortRectify 是 OpenCV 中用于鱼眼镜头畸变校正的一个函…...

RabbitMQ入门

目录 MQ 相关概念 什么是MQ MQ 的作用 什么是RabbitMQ RabbitMQ的安装 安装 erlang 安装 RabbitMQ 安装 RabbitMQ 管理界面 开放云服务器端口 访问 RabbitMQ 管理界面 RabbitMQ 的用户角色 RabbitMQ的工作流程 Producer 和 Consumer Connection 和 Channel Vi…...

电商项目高级篇06-缓存

电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis 缓存 流程图&#xff1a; data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们的单体项目中可以用Map作…...

英伟达发布 Edify 3D 生成模型,可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。

英伟达发布 Edify 3D 生成模型&#xff0c;可以利用 Agents 自动判断提示词场景中需要的模型&#xff0c;生成后将他们组合为一个场景。 Edify 3D 可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。 相关链接 论文&#xff1a;htt…...

数字电路——触发器2(集成触发器,相互转化)

集成触发器基于RS触发器和钟控触发器&#xff0c;想要了解可以参考文章RS和钟控触发器。 一、集成触发器 这里介绍的集成触发器是将其他类型的触发器与RS触发器相结合 1.1 集成D触发器 1.逻辑符号 区分同步和异步工作&#xff1a; 当同步时&#xff0c;和都为1&#xff0c;…...

拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流

在前端开发的世界里&#xff0c;我们总是在不断追寻更高效、更简洁的方式来构建令人惊艳的用户界面。而今天&#xff0c;我要向大家隆重介绍一款具有创新性的工具 ——NoCss.js&#xff0c;它将彻底颠覆你对传统前端开发的认知&#xff0c;引领我们进入一个全新的无 CSS 编程时…...

CentOS 7 安装部署 KVM

1.关闭虚拟机 打开相关选项 打开虚拟机centos7 连接xshell 测试网络&#xff0c;现在就是没问题的&#xff0c;因为我们要使用网络源 安装 GNOME 桌面环境 安装KVM 模块 安装KVM 调试工具 构建虚拟机的命令行工具 qemu 组件,创建磁盘、启动虚拟机等 输入这条命令&#xff0c;…...

【es6】原生js在页面上画矩形添加选中状态高亮及显示调整大小控制框(三)

接上篇文章&#xff0c;这篇实现下选中当前元素显示调整大小的控制框&#xff0c;点击document取消元素的选中高亮状态效果。 实现效果 代码逻辑 动态生成控制按钮矩形,并设置响应的css // 动态添加一个调整位置的按钮addScaleBtn(target) {const w target.offsetWidth;con…...

适用于学校、医院等低压用电场所的智能安全配电装置

引言 电力&#xff0c;作为一种清洁且高效的能源&#xff0c;极大地促进了现代生活的便捷与舒适。然而&#xff0c;与此同时&#xff0c;因使用不当或维护缺失等问题&#xff0c;漏电、触电事件以及电气火灾频发&#xff0c;对人们的生命安全和财产安全构成了严重威胁&#xf…...

通信原理实验:抽样定理实验

目录 一、实验目的和要求 二、实验内容和原理 实验器材 实验原理 三、实验步骤 (一)实验项目一:抽样信号观测及抽样定理验证 四、实验记录与处理 结论: 辅助学习资料: 五、实验结果及分析 一、实验目的和要求 了解抽样定理在通信系统中的重要性。掌握自然抽样及…...

Http 请求协议

HTTP的请求协议 请求数据格式&#xff1a; 请求行 请求数据的第一行&#xff0c;包含请求方式、资源路径、协议及版本。 请求头 从请求数据的第二行&#xff0c;以key: value的格式 常见的请求头 Host&#xff1a;请求的主机名&#xff0c;如&#xff1a;localhost:8080&#x…...

Java中的JSONObject详解

文章目录 Java中的JSONObject详解一、引言二、JSONObject的创建与基本操作1、创建JSONObject2、添加键值对3、获取值 三、JSONObject的高级特性1、遍历JSONObject2、从字符串创建JSONObject3、JSONObject与JSONArray的结合使用4、更新和删除键值对 四、错误处理1. 键值存在性检…...

day01

Hm-Footer.vue <template><div class"hm-footer">我是hm-footer</div></template><script>export default {}</script><style>.hm-footer{height:100px;line-height:100px;text-align:center;font-size:30px;background-…...

shell查看服务器的内存和CPU,实时使用情况

要查看服务器的内存和 CPU 实时使用情况&#xff0c;可以使用以下方法和命令&#xff1a; 1. 使用 top 运行 top 命令以显示实时的系统性能信息&#xff0c;包括 CPU 和内存使用情况。 top按 q 退出。输出内容包括&#xff1a; CPU 使用率&#xff1a;位于顶部&#xff0c;标…...

【后端面试总结】MySQL索引

数据库索引不只一种实现方法&#xff0c;但是其中最具代表性&#xff0c;也是我们面试中遇到最多的无疑是B树。 索引为什么选择B树 数据量很大的查找&#xff0c;是不能直接放入内存的&#xff0c;而是需要什么数据就通过磁盘IO去获得。 红黑树&#xff0c;AVL树等二叉查找树…...

vue3 reactive响应式实现源码

Vue 3 的 reactive 是基于 JavaScript 的 Proxy 实现的&#xff0c;因此它通过代理机制来拦截对象的操作&#xff0c;从而实现响应式数据的追踪。下面是 Vue 3 的 reactive 源码简化版。 Vue 3 reactive 源码简化版 首先&#xff0c;我们需要了解 reactive 是如何工作的&…...

STL之算法概览

目录 算法概览 算法分析与复杂度标识O() STL算法总览 质变算法mutating algorithms----会改变操作对象之值 非质变算法nonmutating algorithms----不改变操作对象之值 STL算法的一般形式 算法的泛化过程 算法概览 算法&#xff0c;问题之解法也。 以有限的步骤&#xff0…...

数据库中的视图

数据库中的视图 什么是视图创建视图使⽤视图修改数据注意事项 删除视图视图的优点 什么是视图 视图是⼀个虚拟的表&#xff0c;它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据&#xff0c;⽽是通过执⾏查询来动态⽣成数据。⽤户可以像操作普通表⼀样使…...

【设计模式】【行为型模式(Behavioral Patterns)】之责任链模式(Chain of Responsibility Pattern)

1. 设计模式原理说明 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许你将请求沿着处理者链进行发送。每个处理者都可以处理请求&#xff0c;或者将其传递给链上的下一个处理者。这种模式使得多个对象都有机会处理请…...

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器&#xff0c;可以在该值发生变化时…...

【面试分享】主流编程语言的内存回收机制及其优缺点

以下是几种主流编程语言的内存回收机制及其优缺点&#xff1a; 一、Java 内存回收机制&#xff1a; Java 使用自动内存管理&#xff0c;主要通过垃圾回收器&#xff08;Garbage Collector&#xff0c;GC&#xff09;来回收不再被使用的对象所占用的内存。Java 的垃圾回收器会定…...

Java中的多线程

文章目录 Java中的多线程一、引言二、多线程的创建和启动1、继承Thread类2、实现Runnable接口 三、线程的常用方法1、currentThread()和getName()2、sleep()和yield()3、join() 四、线程优先级五、使用示例六、总结 Java中的多线程 一、引言 在Java中&#xff0c;多线程编程是…...

TypeError: issubclass() arg 1 must be a class

TypeError: issubclass() arg 1 must be a class 报错代码&#xff1a; import spacy 原因&#xff1a; 库版本错误&#xff0c; 解决方法&#xff1a; pip install typing-inspect0.8.0 typing_extensions4.5.0 感谢作者&#xff1a; langchain TypeError: issubclass() …...

C语言实例之9斐波那契数列实现

1. 斐波那契数列简介 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多・斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为 “兔子数列”。 它的特点是从第三…...

Flink 常用问题及常用配置(有用)

一、Flink 常用问题及常用配置 参数 示例 说明 execution.checkpointing.interval 3min Checkpoint 触发间隔 state.backend rocksdb / filesystem 用于设置statebackend类型, 默认会以内存为statebackend(无法支持大状态) taskmanager.memory.jvm-overhead.max 204…...

什么是内网穿透开发

文章目录 前言实现内网穿透的常见技术方法1. 反向代理与端口映射2. 第三方内网穿透服务3. 自建穿透服务4. VPN&#xff08;虚拟专用网络&#xff09; 内网穿透开发的关键点1. 安全性2. 性能3. 合法性和合规性 适用场景 前言 内网穿透开发是指将位于内网或防火墙后的应用服务&a…...

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…...

创建HTTPS网站

每天&#xff0c;我们都会听到网络上发生身份盗窃和数据侵权的案例&#xff0c;这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词&#xff1a;HTTP与HT…...

【DL笔记】神经网络轻量化(CV方向)的一些论文记录

现在大模型爆火&#xff0c;但俺这种组里只有10系显卡的下水道科研老鼠也要混毕业的&#xff0c;于是选择做小模型&#xff08;x&#xff09;。本人纯科研飞舞一个&#xff0c;刚入学有段时间爱看论文&#xff0c;今天有空把那会看到论文总结下。 轻量化&#xff0c;相关文章的…...

计算(a+b)/c的值

计算&#xff08;ab&#xff09;/c的值 C语言代码C语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定3个整数a、b、c&#xff0c;计算表达式(ab)/c的值&#xff0c;/是整除运算。 输入 输入仅一行&…...

11.26作业

#include "test.h" #include <myhead.h>int main(int argc, const char *argv[]) {Student students[100]; // 假设最多有100个学生int select 0;int n 0; // 学生数量menu();while (1) {printf("请输入你想要的功能&#xff1a;");scanf("%…...

AdaPipe:动态规划解决显存和GPU在LLM计算中出现气泡问题

目录 AdaPipe:动态规划解决显存和GPU在LLM计算中出现气泡问题 0-5表示不同数据 大的方块表示:管道,便于理解了想成GPU 黄色方块表示显存 Stage表示Attention和FFN layer(Projection和MLP) 重计算和分区策略:细化了Attention和FFN layer Transformer中的管道 AdaPi…...

C++设计模式之组合模式中如何实现同一层部件的有序性

在组合模式中&#xff0c;为了实现同一层上部件的有序性&#xff0c;可以采取以下几种设计方法&#xff1a; 1. 使用有序集合 使用有序集合&#xff08;如 std::list、std::vector 或其他有序容器&#xff09;来存储和管理子部件。这种方法可以确保子部件按照特定顺序排列&am…...

QT QRadioButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024,12月27-29日)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 重要信息 会议官网&#xff1a;www.icairc.net 三轮截稿时间&#xff1a;2024年11月30日23:59 录…...

Dubbo的RPC泛化调用

目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口&#xff1f; Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下&#xff0c;对服务方…...

Java面试题、八股文学习之JVM篇

1.对象一定分配在堆中吗&#xff1f;有没有了解逃逸分析技术&#xff1f; 对象不一定总是分配在堆中。在Java等一些高级编程语言中&#xff0c;对象的分配位置可以通过编译器或运行时系统的优化来决定。其中&#xff0c;逃逸分析&#xff08;Escape Analysis&#xff09;是用于…...

Apache Maven Assembly 插件简介

Apache Maven Assembly 插件是一个强大的工具&#xff0c;允许您以多种格式&#xff08;如 ZIP、TAR 和 JAR&#xff09;创建项目的分发包。 该插件特别适用于将项目与其依赖项、配置文件和其他必要资源一起打包。 通过使用 Maven Assembly 插件&#xff0c;您可以将项目作为…...

3174、清除数字

3174、[简单] 清除数字 1、题目描述 给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符&#xff1a; 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。 请你返回删除所有数字字符以后剩下的字符串。 2、解题思路 遍历字符串&#xff1a; 我们需要逐个遍…...

【C#】C# resx方式实现多语言切换(静态切换)

1. 效果 中文界面 英文界面 2. 步骤 1. 添加resx文件 2. Form1.en-GB.resx内容 3. Form1.zh-CN.resx内容 4. Form1.cs修改&#xff08;重点&#xff09; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Syste…...

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony&#xff0c;需要使用linux环境进行代码的编译&#xff0c;为兼顾日常办公需要&#xff0c;可采用WindowsUbuntu虚拟机的混合开发的环境&#xff0c;通过网络及文件夹共享&#xff0c;在主机和虚拟机之间共享文件数据。 工具准备&#x…...

TCP/IP协议攻击与防范

一、TCP/IP协议攻击介绍 1.1 Internet的结构​ LAN&#xff1a;局域网 WAN&#xff1a;广域网 WLAN&#xff1a;无线局域网 私有IP地址与公有IP地址&#xff1f; 私有地址&#xff1a;A类&#xff1a;10.0.0.0~10.255.255.255 B类&#xff1a;172.16.0.0~172.31.255.255…...

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器&#xff0c;也就是Flash启动10系统存储器系统存储器启动&#xff0c;串口下载11SRAM启动SRAM启动&#xff0c;用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时&#xff0c;就是下载…...

vue的理解

什么是vue vue是一套用于构建用户界面的渐进式框架&#xff0c;与其他框架不同的是&#xff0c;vue被设计为可以自底向上逐层应用&#xff0c;它也是创建单页面应用的web应用框架。vue的核心库只关注视图层&#xff0c;不仅易上手&#xff0c;还便于与第三方库或既有项目整合。…...

【Leetcode】3206.交替组1

题目描述&#xff1a; https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例&#xff1a; 解题思路 思路一&#xff1a; 1.如果color.size()小于等于2&#xff0c;则构不成环&#xff0c;直接返回结果…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…...

tomcat 文件上传 (CVE-2017-12615)

目录 1、漏洞描述 2、访问ip&#xff1a;port 3、漏洞利用 4、Exploit 5、修复建议 1、漏洞描述 Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 攻击者将有可能可通过…...

每天五分钟深度学习框架pytorch:卷积神经网络的搭建

本文重点 从本文开始我们将开启卷积神经网络的搭建了,卷积神经网络网络是深度学习中基础的算法模型之一,但是这里我们从实战为主,我们并不会对卷积神经网络详细的介绍,如果不懂得可以看我得《每天五分钟计算机视觉》专栏。 卷积神经网络 卷积神经网络可以认为是多个卷积…...