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

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

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

相关文章

transformer.js(三):底层架构及性能优化指南

Transformer.js 是一个轻量级、功能强大的 JavaScript 库&#xff0c;专注于在浏览器中运行 Transformer 模型&#xff0c;为前端开发者提供了高效实现自然语言处理&#xff08;NLP&#xff09;任务的能力。本文将详细解析 Transformer.js 的底层架构&#xff0c;并提供实用的性…

spf算法、三类LSA、区间防环路机制/规则、虚连接

1.构建spf树&#xff1a; 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略&#xff0c;因为许多新相机提供鲜艳的颜色&#xff0c;鲜明的对比度和改进的弱光性能。然而&#xff0c;有许多应用&#xff0c;选择黑白相机将是更好的选择&#xff0c;因为他们产生更清晰的图像&#xff0c;更好的分辨率&#…

【Flink】快速理解 FlinkCDC 2.0 原理

快速理解 FlinkCDC 2.0 原理 要详细理解 Flink CDC 原理可以看看这篇文章&#xff0c;讲得很详细&#xff1a;深入解析 Flink CDC 增量快照读取机制 (https://juejin.cn/post/7325370003192578075)。 FlnkCDC 2.0&#xff1a; Flink 2.x 引入了增量快照读取机制&#xff0c;…

AI智能体崛起:从“工具”到“助手”的进化之路

目录 AI智能体的崛起 AI智能体的定义与决策模型 AI智能体的特点与优势 AI智能体的应用与类型 面临的挑战 未来展望 近年来&#xff0c;人工智能领域的焦点正从传统的聊天机器人&#xff08;Chat Bot&#xff09;快速转向更具潜力的AI智能体&#xff08;AI Agent&#xff…

RAG架构类型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

jmeter基础06_(练习)常见的http请求

课程大纲 上节课已经尝试进行了get请求&#xff0c;获取网站http://httpbin.org/的首页。 本节课使用网站“httpbin.org”演示几种基础的http请求。post、put、delete方法使用方法相同&#xff0c;所以仅以post为例来演示。 本节课所有请求仅填写&#xff1a;请求行、请求体。j…

SycoTec 4060 ER-S德国高精密主轴电机如何支持模具的自动化加工?

SycoTec 4060 ER-S高速电主轴在模具自动化加工中的支持体现在以下几个关键方面&#xff1a; 1.高精度与稳定性&#xff1a;SycoTec 4060 ER-S锥面跳动小于1微米&#xff0c;确保了加工过程中的极高精度&#xff0c;这对于模具的复杂几何形状和严格公差要求至关重要。高精度加工…

MySQL系列之数据类型(Numeric)

导览 前言一、数值类型综述二、数值类型详解1. NUMERIC1.1 UNSIGNED或SIGNED1.2 数据类型划分 2. Integer类型取值和存储要求3. Fixed-Point类型取值和存储要求4. Floating-Point类型取值和存储要求 结语精彩回放 前言 MySQL系列最近三篇均关注了和我们日常工作或学习密切相关…

Spring |(五)IoC/DI的注解开发

文章目录 &#x1f4da;核心容器&#x1f407;环境准备&#x1f407;容器的创建方式&#x1f407;bean的三种获取方式&#x1f407;BeanFactory的使用 &#x1f4da;IoC/DI注解开发&#x1f407;环境准备&#x1f407;注解开发定义bean&#x1f407;纯注解开发模式&#x1f407…

Linux -日志 | 线程池 | 线程安全 | 死锁

文章目录 1.日志1.1日志介绍1.2策略模式1.3实现日志类 2.线程池2.1线程池介绍2.2线程池的应用场景2.3线程池的设计2.4代码实现2.5修改为单例模式 3.线程安全和函数重入问题3.1线程安全和函数重入的概念3.2总结 4.死锁4.1什么是死锁4.2产生死锁的必要条件4.3避免死锁 1.日志 1.…

AI时代的PPT革命:智能生成PPT工具为何备受青睐?

在日常工作和学习中&#xff0c;PPT是我们不可或缺的表达工具。制作一份精美的PPT常常需要耗费数小时&#xff0c;甚至几天的时间。从选择主题到调整排版&#xff0c;琐碎的细节让人筋疲力尽。但现在一种名为“AI生成PPT”的技术正悄然崛起&#xff0c;彻底颠覆了传统PPT制作的…

结构方程模型(SEM)入门到精通:lavaan VS piecewiseSEM、全局估计/局域估计;潜变量分析、复合变量分析、贝叶斯SEM在生态学领域应用

目录 第一章 夯实基础 R/Rstudio简介及入门 第二章 结构方程模型&#xff08;SEM&#xff09;介绍 第三章 R语言SEM分析入门&#xff1a;lavaan VS piecewiseSEM 第四章 SEM全局估计&#xff08;lavaan&#xff09;在生态学领域高阶应用 第五章 SEM潜变量分析在生态学领域…

CANopen多电机控制的性能分析

在 CANopen 总线上控制多台电机并实时获取位置和速度信息&#xff0c;通信速度受到总线带宽、电机数量、数据刷新频率等因素影响。在 LabVIEW 开发中&#xff0c;利用 PDO 优化数据传输&#xff0c;合理设置刷新周期&#xff0c;并结合高效任务管理&#xff0c;可以显著提高多电…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例

目录 Cusor的主要特点 Cusor实操 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; Cursor 是 Visual Studio Code 的一个分支。这使我们能够…

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测&#xff0c;本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 在鸿蒙生态系统中&#xff0c;虽然原生应用通常基于 ArkTS 实现&#xff0c;但在实际研发过程中发现&#xff0c;使用 C…

二,[ACTF2020 新生赛]Include1感谢 Y1ng 师傅供题。

进入靶场后&#xff0c;发现tips可以点击 点击后进入此页面 猜测此为文件上传漏洞,构造payload&#xff0c;并成功得到base64编码后的源码 详解payload&#xff1a; php://filter/readconvert.base64-encode/resourceflag.php 1.php://filter是PHP中的一个流封装协议&#xf…

EXTI配置流程 含中断延时消抖点亮小灯

如图可知&#xff0c;配置流程分成以下一个部分 ①使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE();// 打开时钟 ②初始化利用 HAL_GPIO_Init 一步到位&#xff0c;可以初始化外设GPIO的一切 4个参数 &#xff08;引脚 Pull 这里选择的模式是从下面这几个里面选 速度&#x…

AIGC-----AIGC在虚拟现实中的应用前景

AIGC在虚拟现实中的应用前景 引言 随着人工智能生成内容&#xff08;AIGC&#xff09;的快速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的应用也迎来了新的契机。AIGC与VR的结合为创造沉浸式体验带来了全新的可能性&#xff0c;这种组合不仅极大地降低了VR内容的…