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

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

运行结果:

使用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=0

for _,_ in df_1.iterrows():
    in_end=in_start+width_x
    out_end=in_end+width_y
    
    if 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+=1

x=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值的结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CTF-Hub SQL 报错注入(纯手动注入)

​ 当输入1时&#xff0c;发现只有查询正确&#xff0c;基本上可以判断出没有回显 开始注入(工具hackerBar) 题目是报错注入&#xff0c;方向就比较明显&#xff0c;大致说一下用到的函数和原理。 常见报错注入函数&#xff1a; 通过 floor() 报错注入通过 extractValue() …

创建HTTPS网站

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

计算(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;/是整除运算。 输入 输入仅一行&…

Flink Sink的使用

经过一系列Transformation转换操作后&#xff0c;最后一定要调用Sink操作&#xff0c;才会形成一个完整的DataFlow拓扑。只有调用了Sink操作&#xff0c;才会产生最终的计算结果&#xff0c;这些数据可以写入到的文件、输出到指定的网络端口、消息中间件、外部的文件系统或者是…

Java【多线程】(1)进程与线程

目录 1.前言 2.正文 2.1什么是进程 2.2PCB&#xff08;进程控制块&#xff09; 2.2.1进程id 2.2.2内存指针 2.2.3文件描述符表 2.2.4进程状态 2.2.4.1就绪状态 2.2.4.2阻塞状态 2.2.5进程优先级 2.2.6进程上下文 2.2.7进程的记账信息 2.3CPU操作进程的方法 2.4什…

一个专为云原生环境设计的高性能分布式文件系统

大家好&#xff0c;今天给大家分享一款开源创新的分布式 POSIX 文件系统JuiceFS&#xff0c;旨在解决海量云存储与各类应用平台&#xff08;如大数据、机器学习、人工智能等&#xff09;之间高效对接的问题。 项目介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统&am…

Jmeter中的断言

7&#xff09;断言 1--响应断言 功能特点 数据验证&#xff1a;验证响应数据是否包含或不包含特定的字符串、模式或值。多种匹配类型&#xff1a;支持多种匹配类型&#xff0c;如文本、正则表达式、文档等。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测…

游戏引擎学习第23天

实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功&#xff0c;表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来&#xff0c;极大提升了开发效率。尽管目前的演示内容较为简单&#xff0c;呈现…

排序算法之冒泡排序篇

冒泡排序的思想&#xff1a; 是一个把元素从小到大排的一个算法思想 相邻的两个元素两两比较&#xff0c;大的那一个元素向后移&#xff0c;小的那个元素向前移 核心逻辑&#xff1a; 比较所有相邻的两个项&#xff0c;如果第一个比第二个大&#xff0c;就交换它们 从头开始…

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 前言&#xff1a;在 Java编程的广袤世界里&#xff0c;数据结构犹如精巧的建筑蓝图&#xff0c;决定着程序在数据处理与存储时的效率、灵活性以…

【笔记】自动驾驶预测与决策规划_Part8_数据驱动的规划方法

文章目录 0. 前言1.生成模型1.1 Diffusion-ES1. Diffusion-ES算法介绍2. Diffusion-ES算法具体流程Diffusion Model 是什么&#xff1f;Diffusion-ES: Evolutionary StrategiesDiffusion-ES MethodDiffusion-ES Mapping Language instructions to reward functions with LLM pr…

React中事件处理和合成事件:理解与使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)

14.1 命令请求的执行过程 一个命令请求从发送到获得回复的过程中&#xff0c;客户端和服务器都需要完成一系列操作。 14.1.1 发送命令请求 当用户在客户端中输入一个命令请求的时候&#xff0c;客户端会把这个命令请求转换为协议格式&#xff0c;然后通过连接到服务器的套接字…

【C语言】字符串左旋的三种解题方法详细分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;方法一&#xff1a;逐字符移动法&#x1f4af;方法二&#xff1a;使用辅助空间法&#x1f4af;方法三&#xff1a;三次反转法&#x1f4af;方法对…

【AI绘画】Midjourney进阶:色调详解(上)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;Midjourney中的色彩控制为什么要控制色彩&#xff1f;为什么要在Midjourney中控制色彩&#xff1f; &#x1f4af;色调白色调淡色调明色调 &#x1f4af…

零基础学安全--云技术基础

目录 学习连接 前言 云技术历史 云服务 公有云服务商 云分类 基础设施即服务&#xff08;IaaS&#xff09; 平台即服务&#xff08;PaaS&#xff09; 软件即服务&#xff08;SaaS&#xff09; 云架构 虚拟化 容器 云架构设计 组件选择 基础设施即代码 集成部署…

【Linux】网络通信

TCP协议是一个安全的、面向连接的、流式传输协议&#xff0c;所谓的面向连接就是三次握手&#xff0c;对于程序猿来说只需要在客户端调用connect()函数&#xff0c;三次握手就自动进行了。先通过下图看一下TCP协议的格式&#xff0c;然后再介绍三次握手的具体流程。 TCP的三次握…

Pgsql:json字段查询与更新

1.查询json字段的值 SELECT attribute_data->>设施类别 mycol, * FROM gis_coord_data WHERE attribute_data->>设施类别阀门井 查询结果如下&#xff1a; 2.更新json字段中的某个属性值 UPDATE gis_coord_data SET attribute_data(attribute_data::jsonb ||{&quo…

对于GC方面,在使用Elasticsearch时要注意什么?

大家好&#xff0c;我是锋哥。今天分享关于【对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; 对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…

基于Netty实现聊天室

前言 了解了Netty的基本功能和相关概念&#xff0c;使用基于Netty实现多人聊天的功能。 需求 1.服务端能够接收客户端的注册&#xff0c;并且接受用户的信息注册 2.服务端能够处理客户端发送的消息&#xff0c;并且根据消息类型进行私发或者广播发送消 3.服务端能够私发消…