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

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

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

前言

  • LSTM模型一直是一个很经典的模型,这个模型当然也很复杂,一般需要先学习RNN、GRU模型之后再学,GRU、LSTM的模型讲解将在这两天发布更新,其中:
    • 深度学习基础–一文搞懂RNN
    • 深度学习基础–GRU学习笔记(李沐《动手学习深度学习》)
  • 这一篇:是基于LSTM模型火灾预测研究,讲述了如何构建时间数据、模型如何构建、pytorch中LSTM的API、动态调整学习率等=,最后用RMSE、R2做评估
  • 欢迎收藏 + 关注,本人将会持续更新

文章目录

    • 1、导入数据与数据展示
      • 1、导入库
      • 2、导入数据
      • 3、数据可视化
      • 4、相关性分析(热力图展示)
      • 5、特征提取
    • 2、时间数据构建
      • 1、数据标准化
      • 2、构建时间数据集
      • 3、划分数据集和加载数据集
      • 1、数据划分
    • 3、模型构建
    • 4、模型训练
      • 1、训练集函数
      • 2、测试集函数
      • 3、模型训练
    • 5、结果展示
      • 1、损失函数
      • 2、预测展示
      • 3、R2评估

1、导入数据与数据展示

1、导入库

import torch  
import torch.nn as nn 
import pandas as pd 
import numpy as np 
import seaborn as sns 
import matplotlib.pylab as plt # 设置分辨率
plt.rcParams['savefig.dpi'] = 500  # 图片分辨率
plt.rcParams['figure.dpi'] = 500 # 分辨率device = "cpu"device
'cpu'

2、导入数据

data_df = pd.read_csv('./woodpine2.csv')data_df.head()
TimeTem1CO 1Soot 1
00.00025.00.00.0
10.22825.00.00.0
20.45625.00.00.0
30.68525.00.00.0
40.91325.00.00.0

数据位实验数据,数据是定时收集的:

  • Time: 时间从 0.000 开始,每隔大约 0.228 的间隔递增。
  • Tem1: 是温度(Temperature)的缩写,单位可能是摄氏度 (°C)。
  • CO: 是指一氧化碳 (Carbon Monoxide) 的浓度。
  • Soot: 是指烟炱或炭黑 (Soot) 的浓度。
# 数据信息查询
data_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5948 entries, 0 to 5947
Data columns (total 4 columns):#   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  0   Time    5948 non-null   float641   Tem1    5948 non-null   float642   CO 1    5948 non-null   float643   Soot 1  5948 non-null   float64
dtypes: float64(4)
memory usage: 186.0 KB
# 数据缺失值
data_df.isnull().sum()
Time      0
Tem1      0
CO 1      0
Soot 1    0
dtype: int64

3、数据可视化

时间是每隔固定时间收集的,故有用特征为:温度、CO、Soot

_, ax = plt.subplots(1, 3, constrained_layout=True, figsize=(14, 3)) # constrained_layout=True  自动调整子图sns.lineplot(data=data_df['Tem1'], ax=ax[0])
sns.lineplot(data=data_df['CO 1'], ax=ax[1])
sns.lineplot(data=data_df['Soot 1'], ax=ax[2])
plt.show()


在这里插入图片描述

4、相关性分析(热力图展示)

columns = ['Tem1', 'CO 1', 'Soot 1']plt.figure(figsize=(8, 6))
sns.heatmap(data=data_df[columns].corr(), annot=True, fmt=".2f")
plt.show()


在这里插入图片描述

# 统计分析
data_df.describe()
TimeTem1CO 1Soot 1
count5948.0000005948.0000005948.0000005948.000000
mean226.133238152.5349190.0000350.000222
std96.60144577.0260190.0000220.000144
min0.00000025.0000000.0000000.000000
25%151.00000089.0000000.0000150.000093
50%241.000000145.0000000.0000340.000220
75%310.000000220.0000000.0000540.000348
max367.000000307.0000000.0000800.000512

当我看到相关性为1的时候,我也惊呆了,后面查看了统计量,还是没发现出来,但是看上面的可视化图展示,我信了,随着温度升高,CO化碳、Soot浓度一起升高,这个也符合火灾的场景,数据没啥问题

5、特征提取

# 由于时间间隔一样,故这里去除
data = data_df.iloc[:, 1:]data.head(3)
Tem1CO 1Soot 1
025.00.00.0
125.00.00.0
225.00.00.0
data.tail(3)
Tem1CO 1Soot 1
5945292.00.0000770.000491
5946291.00.0000760.000489
5947290.00.0000760.000487

特征间数据差距较大,故需要做标准化

2、时间数据构建

1、数据标准化

from sklearn.preprocessing import MinMaxScalersc = MinMaxScaler()for col in ['Tem1', 'CO 1', 'Soot 1']:data[col] = sc.fit_transform(data[col].values.reshape(-1, 1))# 查看维度
data.shape
(5948, 3)

2、构建时间数据集

LSTM 模型期望输入数据的形状是 (样本数, 时间步长, 特征数),本文数据:

  • 样本数:5948
  • 时间步长:本文设置为8
    • 即是:取特征每8行(Tem1, CO 1, Soot 1)为一个时间段,第9个时间段的Tem1为y(温度),火灾预测本质也是预测温度
  • 特征数:3
width_x = 8
width_y = 1# 构建时间数据X, y(解释在上)
X, y = [], []# 设置开始构建数据位置
start_position = 0for _, _ in data.iterrows():in_end = start_position + width_xout_end = in_end + width_y if out_end < len(data):# 采集时间数据集X_ = np.array(data.iloc[start_position : in_end, :])y_ = np.array(data.iloc[in_end : out_end, 0])X.append(X_)y.append(y_)start_position += 1# 转化为数组
X = np.array(X)
# y也要构建出适合维度的变量
y = np.array(y).reshape(-1, 1, 1)X.shape, y.shape
((5939, 8, 3), (5939, 1, 1))

3、划分数据集和加载数据集

1、数据划分

# 取前5000个数据位训练集,后面为测试集
X_train = torch.tensor(np.array(X[:5000, ]), dtype=torch.float32)
X_test = torch.tensor(np.array(X[5000:, ]), dtype=torch.float32)y_train = torch.tensor(np.array(y[:5000, ]), dtype=torch.float32)
y_test = torch.tensor(np.array(y[5000:, ]), dtype=torch.float32)X_train.shape, y_train.shape 
(torch.Size([5000, 8, 3]), torch.Size([5000, 1, 1]))

数据集构建:

  • TensorDataset 是 PyTorch 中的一个类,用于将两个或多个张量组合成一个数据集。每个样本由一个输入张量和一个目标张量组成(构建的数据集中,每一个输入对应一个输出)
from torch.utils.data import TensorDataset, DataLoaderbatch_size = 64train_dl = DataLoader(TensorDataset(X_train, y_train),batch_size=batch_size,shuffle=True)test_dl = DataLoader(TensorDataset(X_test, y_test),batch_size=batch_size,shuffle=False)

3、模型构建

nn.LSTM 的 API

*构造函数

torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0, bidirectional=False, proj_size=0)
  • input_size (int):每个时间步输入特征的数量。
  • hidden_size (int):LSTM 层中隐藏状态(h)的特征数。这也是 LSTM 输出的特征数量,除非指定了 proj_size
  • num_layers (int, 可选):LSTM 层的数量。默认值为 1。
  • bias (bool, 可选):如果为 True,则使用偏置项;否则不使用。默认值为 True
  • batch_first (bool, 可选):如果为 True,则输入和输出张量的形状为 (batch, seq, feature);否则为 (seq, batch, feature)。默认值为 False
  • dropout (float, 可选):除了最后一层之外的所有 LSTM 层之后应用的 dropout 概率。如果 num_layers = 1,则不会应用 dropout。默认值为 0。
  • bidirectional (bool, 可选):如果为 True,则变为双向 LSTM。默认值为 False
  • proj_size (int, 可选):如果大于 0,则 LSTM 会将隐藏状态投影到一个不同维度的空间。这减少了模型参数的数量,并且可以加速训练。默认值为 0,表示没有投影。

输入

  • input (tensor):形状为 (seq_len, batch, input_size) 或者如果 batch_first=True 则为 (batch, seq_len, input_size)
  • (h_0, c_0) (tuple, 可选):包含两个张量 (h_0, c_0),分别代表初始的隐藏状态和细胞状态。它们的形状均为 (num_layers * num_directions, batch, hidden_size)。如果没有提供,那么所有状态都会被初始化为零。

其中

  • 单向 LSTM (bidirectional=False):此时 num_directions=1。LSTM 只按照时间序列的顺序从前向后处理数据,即从第一个时间步到最后一个时间步。
  • 双向 LSTM (bidirectional=True):此时 num_directions=2。双向 LSTM 包含两个独立的 LSTM 层,一个按正常的时间顺序从前向后处理数据,另一个则反过来从后向前处理数据。这样做可以让模型同时捕捉到过去和未来的信息,对于某些任务(如自然语言处理中的语义理解)特别有用。

输出(两个)

  • output (tensor):包含了最后一个时间步的输出特征(h_t)。如果 batch_first=True,则形状为 (batch, seq_len, num_directions * hidden_size);否则为 (seq_len, batch, num_directions * hidden_size)。注意,如果 proj_size > 0,则输出的最后一个维度将是 num_directions * proj_size
  • (h_n, c_n) (tuple):包含两个张量 (h_n, c_n),分别代表所有时间步后的最终隐藏状态和细胞状态。它们的形状均为 (num_layers * num_directions, batch, hidden_size)。同样地,如果 proj_size > 0,则 h_n 的最后一个维度将是 proj_size
'''
模型采用两个lstm层:3->320:lstm->320:lstm(进一步提取时间特征)->1:linear
'''class model_lstm(nn.Module):def __init__(self):super().__init__()self.lstm1 = nn.LSTM(input_size=3, hidden_size=320, num_layers=1, batch_first=True)self.lstm2 = nn.LSTM(input_size=320, hidden_size=320, num_layers=1, batch_first=True)self.fc = nn.Linear(320, 1)def forward(self, x):out, hidden = self.lstm1(x)out, _ = self.lstm2(out)out = self.fc(out)   # 这个时候,输出维度(batch_size, sequence_length, output_size), 这里是(64, 8, 1)return out[:, -1, :].view(-1, 1, 1)  # 取最后一条数据  (64, 1, 1), 在pytorch中如果一个维度是1,可能会自动压缩,所以这里需要再次形状重塑model = model_lstm().to(device)
model
model_lstm((lstm1): LSTM(3, 320, batch_first=True)(lstm2): LSTM(320, 320, batch_first=True)(fc): Linear(in_features=320, out_features=1, bias=True)
)
# 先做测试
model(torch.rand(30, 8, 3)).shape
torch.Size([30, 1, 1])

4、模型训练

1、训练集函数

def train(train_dl, model, loss_fn, optimizer, lr_scheduler=None):size = len(train_dl.dataset)num_batchs = len(train_dl)train_loss = 0for X, y in train_dl:X, y = X.to(device), y.to(device)pred = model(X)loss = loss_fn(pred, y)optimizer.zero_grad()loss.backward()optimizer.step()train_loss += loss.item()if lr_scheduler is not None:lr_scheduler.step()print("learning rate = {:.5f}".format(optimizer.param_groups[0]['lr']), end="  ")train_loss /= num_batchsreturn train_loss

2、测试集函数

def test(test_dl, model, loss_fn):size = len(test_dl.dataset)num_batchs = len(test_dl)test_loss = 0with torch.no_grad():for X, y in test_dl:X, y = X.to(device), y.to(device)pred = model(X)loss = loss_fn(pred, y)test_loss += loss.item()test_loss /= num_batchsreturn test_loss

3、模型训练

# 设置超参数
loss_fn = nn.MSELoss()
lr = 1e-1
opt = torch.optim.SGD(model.parameters(), lr=lr, weight_decay=1e-4) # weight_decay 实际上是在应用 L2 正则化(也称为权重衰减)epochs = 50# 动态调整学习率
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, epochs, last_epoch=-1)train_loss = []
test_loss = []for epoch in range(epochs):model.train()epoch_train_loss = train(train_dl, model, loss_fn, opt, lr_scheduler)model.eval()epoch_test_loss = test(test_dl, model, loss_fn)train_loss.append(epoch_train_loss)test_loss.append(epoch_test_loss)template = ('Epoch:{:2d}, Train_loss:{:.5f}, Test_loss:{:.5f}')     print(template.format(epoch+1, epoch_train_loss,  epoch_test_loss))
learning rate = 0.09990  Epoch: 1, Train_loss:0.00320, Test_loss:0.00285
learning rate = 0.09961  Epoch: 2, Train_loss:0.00022, Test_loss:0.00084
learning rate = 0.09911  Epoch: 3, Train_loss:0.00015, Test_loss:0.00058
learning rate = 0.09843  Epoch: 4, Train_loss:0.00015, Test_loss:0.00057
learning rate = 0.09755  Epoch: 5, Train_loss:0.00015, Test_loss:0.00072
learning rate = 0.09649  Epoch: 6, Train_loss:0.00015, Test_loss:0.00059
learning rate = 0.09524  Epoch: 7, Train_loss:0.00015, Test_loss:0.00058
learning rate = 0.09382  Epoch: 8, Train_loss:0.00015, Test_loss:0.00058
learning rate = 0.09222  Epoch: 9, Train_loss:0.00015, Test_loss:0.00057
learning rate = 0.09045  Epoch:10, Train_loss:0.00015, Test_loss:0.00066
learning rate = 0.08853  Epoch:11, Train_loss:0.00015, Test_loss:0.00077
learning rate = 0.08645  Epoch:12, Train_loss:0.00015, Test_loss:0.00071
learning rate = 0.08423  Epoch:13, Train_loss:0.00015, Test_loss:0.00071
learning rate = 0.08187  Epoch:14, Train_loss:0.00015, Test_loss:0.00061
learning rate = 0.07939  Epoch:15, Train_loss:0.00015, Test_loss:0.00056
learning rate = 0.07679  Epoch:16, Train_loss:0.00015, Test_loss:0.00065
learning rate = 0.07409  Epoch:17, Train_loss:0.00015, Test_loss:0.00056
learning rate = 0.07129  Epoch:18, Train_loss:0.00015, Test_loss:0.00058
learning rate = 0.06841  Epoch:19, Train_loss:0.00015, Test_loss:0.00062
learning rate = 0.06545  Epoch:20, Train_loss:0.00015, Test_loss:0.00062
learning rate = 0.06243  Epoch:21, Train_loss:0.00015, Test_loss:0.00069
learning rate = 0.05937  Epoch:22, Train_loss:0.00015, Test_loss:0.00057
learning rate = 0.05627  Epoch:23, Train_loss:0.00015, Test_loss:0.00064
learning rate = 0.05314  Epoch:24, Train_loss:0.00015, Test_loss:0.00072
learning rate = 0.05000  Epoch:25, Train_loss:0.00015, Test_loss:0.00061
learning rate = 0.04686  Epoch:26, Train_loss:0.00015, Test_loss:0.00058
learning rate = 0.04373  Epoch:27, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.04063  Epoch:28, Train_loss:0.00015, Test_loss:0.00059
learning rate = 0.03757  Epoch:29, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.03455  Epoch:30, Train_loss:0.00015, Test_loss:0.00060
learning rate = 0.03159  Epoch:31, Train_loss:0.00015, Test_loss:0.00067
learning rate = 0.02871  Epoch:32, Train_loss:0.00015, Test_loss:0.00065
learning rate = 0.02591  Epoch:33, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.02321  Epoch:34, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.02061  Epoch:35, Train_loss:0.00015, Test_loss:0.00067
learning rate = 0.01813  Epoch:36, Train_loss:0.00015, Test_loss:0.00062
learning rate = 0.01577  Epoch:37, Train_loss:0.00015, Test_loss:0.00065
learning rate = 0.01355  Epoch:38, Train_loss:0.00015, Test_loss:0.00064
learning rate = 0.01147  Epoch:39, Train_loss:0.00014, Test_loss:0.00063
learning rate = 0.00955  Epoch:40, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.00778  Epoch:41, Train_loss:0.00015, Test_loss:0.00060
learning rate = 0.00618  Epoch:42, Train_loss:0.00014, Test_loss:0.00063
learning rate = 0.00476  Epoch:43, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.00351  Epoch:44, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.00245  Epoch:45, Train_loss:0.00015, Test_loss:0.00062
learning rate = 0.00157  Epoch:46, Train_loss:0.00015, Test_loss:0.00062
learning rate = 0.00089  Epoch:47, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.00039  Epoch:48, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.00010  Epoch:49, Train_loss:0.00015, Test_loss:0.00063
learning rate = 0.00000  Epoch:50, Train_loss:0.00015, Test_loss:0.00063

5、结果展示

1、损失函数

import matplotlib.pyplot as plt 
from datetime import datetime 
current_time = datetime.now() # 获取当前时间 plt.figure(figsize=(5, 3),dpi=120)   
plt.plot(train_loss    , label='LSTM Training Loss') 
plt.plot(test_loss, label='LSTM Validation Loss')   
plt.title('Training and Validation Loss') 
plt.xlabel(current_time) # 打卡请带上时间戳,否则代码截图无效 
plt.legend() 
plt.show()


在这里插入图片描述

效果不错,收敛了

2、预测展示

predicted_y_lstm = sc.inverse_transform(model(X_test).detach().numpy().reshape(-1,1))                    # 测试集输入模型进行预测 
y_test_1         = sc.inverse_transform(y_test.reshape(-1,1)) 
y_test_one       = [i[0] for i in y_test_1] 
predicted_y_lstm_one = [i[0] for i in predicted_y_lstm]   
plt.figure(figsize=(5, 3),dpi=120) # 画出真实数据和预测数据的对比曲线 
plt.plot(y_test_one[:2000], color='red', label='real_temp') 
plt.plot(predicted_y_lstm_one[:2000], color='blue', label='prediction')   
plt.title('Title') 
plt.xlabel('X') 
plt.ylabel('Y') 
plt.legend() 
plt.show()


在这里插入图片描述

3、R2评估

from sklearn import metrics 
""" 
RMSE :均方根误差  ----->  对均方误差开方 
R2   :决定系数,可以简单理解为反映模型拟合优度的重要的统计量 
""" 
RMSE_lstm  = metrics.mean_squared_error(predicted_y_lstm_one, y_test_1)**0.5 
R2_lstm    = metrics.r2_score(predicted_y_lstm_one, y_test_1)   
print('均方根误差: %.5f' % RMSE_lstm) 
print('R2: %.5f' % R2_lstm)
均方根误差: 0.00001
R2: 0.82422

rmse、r2都不错,但是拟合度还可以再提高

相关文章:

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…...

云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”

2024 年 12 月 24 日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办的“2025 中国信通院深度观察报告会&#xff1a;算力互联网分论坛”&#xff0c;在北京隆重召开。本次论坛以“算力互联网 新质生产力”为主题&#xff0c;全面展示中国…...

centos 安全配置基线

centos 安全配置基线 一、系统防火墙及SE系统1. 系统自带防火墙iptables&#xff08;Centos6&#xff09;基础命令查看防火墙设置使用命令查看防火墙设置使用命令清除防火墙设置防火墙策略开放指定的端口屏蔽IP 2. 系统自带防火墙firewalled&#xff08;Centos7&#xff09;基础…...

语音技术在播客领域的应用(2)

播客是以语音为主&#xff0c;各种基于AI 的语音技术在播客领域十分重要。 语音转文本 Whisper Whisper 是OpenAI 推出的开源语音辨识工具&#xff0c;可以把音档转成文字&#xff0c;支援超过50 种语言。这款工具是基于68 万小时的训练资料&#xff0c;其中包含11.7 万小时的…...

html的iframe页面给帆软BI发送消息

需求&#xff1a;帆软的网页组件嵌套一个HTML页面&#xff0c;HTML页面要给帆软发消息。 解决方法是&#xff1a;fineReportWindow.duchamp.getWidgetByName("txt1").setValue(666); <!DOCTYPE html> <html lang"en"> <head> <…...

Dart语言的字符串处理

Dart语言的字符串处理 目录 引言字符串的定义与基本特性字符串的创建字符串的操作字符串拼接字符串截取字符串替换字符串分割字符串查询字符串格式化正则表达式在字符串处理中的应用字符串编码与解码示例代码总结 1. 引言 在现代编程中&#xff0c;字符串处理是一个非常重要…...

迅为RK3576开发板Android 多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…...

基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&…...

Banana Pi BPI-RV2 RISC-V路由开发板采用矽昌通信SF2H8898芯片

Banana Pi BPI-RV2 开源网关是⼀款基于矽昌SF2H8898 SoC的设备&#xff0c;1 2.5 G WAN⽹络接⼝、5 个千兆LAN ⽹络接⼝、板载 512MB DDR3 内存 、128 MiB NAND、16 MiB NOR、M.2接⼝&#xff0c;MINI PCIE和USB 2.0接⼝等。 Banana Pi BPI-RV2 开源网关是矽昌和⾹蕉派开源社…...

【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解

目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…...

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…...

Unity-Mirror网络框架-从入门到精通之RigidbodyBenchmark示例

文章目录 前言示例代码逻辑测试结论性能影响因素最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计,它…...

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…...

EWM 供应商退货

目录 1 简介 2 参考内向交货单退货场景 2.1 后台配置 ERP 配置 EWM 配置 2.2 主数据 2.3 业务操作 3 创建 return PO 退货场景 3.1 后台配置 ERP 配置 EWM 配置 3.2 主数据 3.3 业务操作 1 简介 EWM 供应商退货支持 2种方式退货: 1)参考内向交货单退货 2)创建…...

深度学习基础--GRU学习笔记(李沐《动手学习深度学习》)

前言 GRU是RNN模型的升级版&#xff0c;也是LSTM的弱化版&#xff0c;学习GRU也是为了学习LSTM做准备&#xff0c;这一篇文章是学习笔记&#xff1b;RNN&#xff1a;RNN讲解参考&#xff1a;李沐动手学习深度学习&#xff1b;欢迎收藏加关注&#xff0c;本人将会持续更新。 文…...

Linux-C/C++--初探linux应用编程概念

对于大多数首次接触 Linux 应用编程的读者来说&#xff0c;可能对应用编程&#xff08;也可称为系统编程&#xff09;这个概念并不 太了解&#xff0c;所以在正式学习 Linux 应用编程之前&#xff0c;笔者有必要向大家介绍这些简单基本的概念&#xff0c;从整体上认识 到应用编…...

计算机基础专业课

后面进一步完善内容&#xff01; 第一部分&#xff1a;计算机基础知识5% 第一章&#xff1a;计算机概述 第二章&#xff1a;信息表示与编码 第二部分&#xff1a;计算机软硬件基础25% 第三章&#xff1a;计算机系统组成&#xff08;计算机组成原理&#xff09; 第四章&am…...

6. 快速掌握抽象类及接口

目录 1. 抽象类1.1 抽象类语法1.2 抽象类特性1.3 抽象类的作用 2. 接口2.1 接口语法2.2 接口的特性 3. 接口案例4. 常用接口4.1 Comparable接口---compareTo()方法4.2 clonable接口---clone方法4.2 深拷贝和浅拷贝 5. Object类5.1 equals()方法5.2 toString()方法5.3 hashCode(…...

P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境&#xff1a;Python 3.8.12 编译器&#xff1a;jupyter notebook 深度学习环境&#xff1a;torch 1.12.0cu113 一、前期准备 1.设置GPU im…...

GPT-5 传言:一场正在幕后发生的 AI 变革

新的一年&#xff0c;让我们从一个引人入胜的话题开始&#xff1a;如果我告诉你&#xff0c;GPT-5 并非虚构&#xff0c;而是真实存在呢&#xff1f;它不仅真实存在&#xff0c;而且正在你看不见的地方悄然塑造着世界。我的基本假设是&#xff1a;OpenAI 已经秘密开发出 GPT-5&…...

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…...

一、1-2 5G-A通感融合基站产品及开通

1、通感融合定义和场景&#xff08;阅读&#xff09; 1.1通感融合定义 1.2通感融合应用场景 2、通感融合架构和原理&#xff08;较难&#xff0c;理解即可&#xff09; 2.1 感知方式 2.2 通感融合架构 SF&#xff08;Sensing Function&#xff09;&#xff1a;核心网感知控制…...

深度学习加速性能分析与Roofline Model

深度学习加速性能分析 动因:由于深度学习加速器普遍采用时分复用(当然随着Graphcore等dataflow类型的芯片除外,他们是空间划分)。此时,硬件资源在不同时刻执行的计算发生变化,很难以单一时刻的计算类型进行硬件设计。所以寻找平均资源利用率就变得更重要方法:针对不同任…...

React 第三方状态管理库相关 -- Redux MobX 篇

一、redux 首先安装依赖&#xff1a; npm install redux react-redux reduxjs/toolkit 示例代码&#xff1a; // src/store/index.js import { configureStore } from reduxjs/toolkit import couterSlice from ./couterSliceconst store configureStore({reducer:{coute…...

“扣子”开发之四:与千帆AppBuilder比较

上一个专题——“扣子”开发——未能落地&#xff0c;开始抱着极大的热情进入&#xff0c;但迅速被稚嫩的架构模型折磨打击&#xff0c;硬着头皮坚持了两周&#xff0c;终究还是感觉不实用不趁手放弃了。今天询问了下豆包&#xff0c;看看还有哪些比较好的AI开发平台&#xff0…...

C++实现红黑树

红黑树 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&…...

Vue3:当v-if和v-for同时使用时产生的问题和解决办法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbci…...

python爬虫入门(理论)

python爬虫 学习网站 一、准备 环境搭建 requests beautifulsoup4 selenium 爬虫架构 URL管理器&#xff1a;管理URL&#xff0c;存储已爬取或待爬取的URL 网页下载器&#xff1a;破解网页&#xff0c;进行下载 网页解析器&#xff1a;对网页的HTML样式、连接的URL等进…...

有效提取激光雷达点云平面点

有效地面点云的提取和平面点的识别是通过一系列步骤实现的。以下是主要步骤&#xff1a; 高度过滤&#xff1a; 首先&#xff0c;根据激光雷达传感器的安装高度&#xff0c;对当前帧扫描得到的点云进行高度过滤&#xff0c;以初步分割出地面点云。假设第 k k k 帧的点云为 { …...

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…...

基于PHP的校园新闻发布管理

摘要 近年来&#xff0c;随着互联网技术的迅速发展&#xff0c;人们获取新闻的渠道也变得越来越多样化&#xff0c;已经不再拘束于传统的报纸、期刊、杂志等纸质化的方式&#xff0c;而是通过网络满足了人们获得第一手新闻的愿望&#xff0c;这样更加有助于实现新闻的规范化管…...

LabVIEW时域近场天线测试

随着通信技术的飞速发展&#xff0c;特别是在5G及未来通信技术中&#xff0c;天线性能的测试需求日益增加。对于短脉冲天线和宽带天线的时域特性测试&#xff0c;传统的频域测试方法已无法满足其需求。时域测试方法在这些应用中具有明显优势&#xff0c;可以提供更快速和精准的…...

组播PIM-原理介绍+报文分析+配置示例

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在PIMv2协议报文的基础上进行介绍&#xff0c;以详细介绍组播协议PIM。 这里需要说明的是&#xff0c;以下内容都针对的是ASM&a…...

规避路由冲突

路由冲突是指在网络中存在两个或多个路由器在进行路由选择时出现矛盾&#xff0c;导致网络数据包无法正确传输&#xff0c;影响网络的正常运行。为了规避路由冲突&#xff0c;可以采取以下措施&#xff1a; 一、合理规划IP地址 分配唯一IP&#xff1a;确保每个设备在网络中都有…...

Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的…...

【C++】非类型模板参数 || 类模板的特化

目录 1. 非类型模板参数 2. 模板特化 3. 类模板特化 3.1.全特化 3.2 部分特化 3.3 参数更进一步限制 3.4 类模板应用 1. 非类型模板参数 模板参数分类类型形参与非类型形参。类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型…...

Python基本概念与实践

Python语言&#xff0c;总给我一种“嗯&#xff1f;还能这么玩儿&#xff1f;”的感觉 Python像一个二三十岁的年轻人&#xff0c;自由、年轻、又灵活 欢迎一起进入Python的世界~ 本人工作中经常使用Python&#xff0c;针对一些常用的语法概念进行持续记录。 一、类与常见数据结…...

SQL Prompt 插件

SQL Prompt 插件 注&#xff1a;SQL Prompt插件提供智能代码补全、SQL格式化、代码自动提示和快捷输入等功能&#xff0c;非常方便&#xff0c;可以自行去尝试体会。 1、问题 SSMS&#xff08;SQL Server Management Studio&#xff09;是SQL Server自带的管理工具&#xff0c…...

1.6 从 GPT-1 到 GPT-3.5:一路的风云变幻

从 GPT-1 到 GPT-3.5:一路的风云变幻 人工智能的进步一直是科技领域的一个重要话题,而在自然语言处理(NLP)领域,GPT(Generative Pre-trained Transformer)系列模型的发布,标志着一个又一个技术突破。从2018年发布的 GPT-1 到2022年推出的 GPT-3.5,OpenAI 的每一次更新…...

centos 7 Mysql服务

将此服务器配置为 MySQL 服务器&#xff0c;创建数据库为 hubeidatabase&#xff0c;将登录的root密码设置为Qwer1234。在库中创建表为 mytable&#xff0c;在表中创建 2 个用户&#xff0c;分别为&#xff08;xiaoming&#xff0c;2010-4-1&#xff0c;女&#xff0c;male&…...

参数校验 Spring Validation框架

后端参数校验 解决&#xff1a;校验前端传入的参数是否符合预期 1、引入依赖 使用Spring Validation框架 <!-- validation参数校验框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validatio…...

sunrays-framework 微调

文章目录 1.common-log4j2-starter 动态获取并打印日志存储的根目录的绝对路径以及应用的访问地址1.目录2.log4j2.xml 配置LOG_HOME3.LogHomePrinter.java 配置监听器4.spring.factories 注册监听器5.测试1.common-log4j2-starter-demo 配置2.启动测试 2.common-minio-starter …...

Java正则转带中划线或下划线属性名为驼峰命名

Java正则转带中划线或下划线属性名为驼峰命名。 利用Java正则分组匹配的方式&#xff0c;将属性名中 -(_) 后接的字母&#xff0c;匹配上了去掉当前 -(_)&#xff0c;将后接的字母转为大写&#xff0c;再追加拼接起来&#xff0c;就完成了驼峰命名。 String lineToHump(Strin…...

WebSocket实现分布式的不同方案对比

引言 随着实时通信需求的日益增长&#xff0c;WebSocket作为一种基于TCP的全双工通信协议&#xff0c;在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而&#xff0c;在分布式环境下&#xff0c;如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几…...

Linux下的dev,sys和proc(TODO)

&#xff08;TODO&#xff09; 还有一个sysfs 在 Linux 系统中&#xff0c;/dev、/sys 和 /proc 是三个特殊的虚拟文件系统目录&#xff0c;它们各自有特定的用途&#xff0c;主要用于与设备和内核交互。以下是它们的详细区别和功能说明&#xff1a; 1. /dev&#xff08;Devi…...

JavaScript系列(32)-- WebAssembly集成详解

JavaScript WebAssembly集成详解 &#x1f680; 今天&#xff0c;让我们深入了解JavaScript与WebAssembly的集成&#xff0c;这是一项能够显著提升Web应用性能的关键技术。 WebAssembly基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;WebAssembly&#xff08;简称W…...

通过外部链接启动 Flutter App(详细介绍及示例)

通过外部链接启动 Flutter App&#xff08;firebase_dynamic_links 和 app_links&#xff09; 详细介绍 通过外部链接启动flutter App 的使用及示例 在我们的APP中&#xff0c;经常有点击链接启动并进入APP的需求&#xff08;如果未安装跳转到应用商店&#xff09;。Android通…...

计算机视觉模型的未来:视觉语言模型

一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…...

CTK插件框架学习-源码下载编译(01)

1、编译环境 window11、vs17、Qt5.14.0、cmake3.27.4 2、下载链接 cmake&#xff1a;Index of /files/v3.20 qt&#xff1a;Index of / vs22以前的版本需要登录下载&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 vs22下载&#xff1a;下载 Visu…...

Python 字符串分割时 spilt 和 re 效率对比

假设 有一些文件名是 数字_文档名 的格式&#xff0c;如何用python将数字提取出来&#xff1f; 可以使用 Python 的正则表达式模块 re 提取文件名中的数字部分。以下是实现代码&#xff1a; 示例代码&#xff1a; import re# 示例文件名列表 file_names ["1_file1.txt…...