第三十四周:文献阅读+LSTM学习

目录

摘要

Abstract

文献阅读:综合EMD-LSTM模型在城市排水管网水质预测中的应用

现有问题

提出方法

EMD-LSTM综合模型

研究框架

结论

Long Short-term Memory(长短期记忆)

1. LSTM的结构

2. Multiple-layer LSTM

3.3 LSTM Example

3. GRU

LSTM实现PM2.5预测

总结


摘要

在本周阅读的文献中,提出了以EMD为中心的数据预处理模块和LSTM预测模块相结合的城市排水管网水质HCI综合预测模型。在EMD-LSTM模型中,EMD允许保留异常值并利用非对齐时刻的数据,这有助于捕获数据模式,而LSTM神经网络强大的非线性映射和学习能力可以对水质进行时间序列预测,综合预测模型实现对城市排水网络水质的准确预测。LSTM是一种特殊的RNN,比普通的RNN多了三个“门”,可以让信息有选择性的通过。LSTM能够在更长的序列中有更好的表现,解决了RNN训练时的梯度无效问题。

Abstract

The literature read this week proposes a comprehensive prediction model for urban drainage network water quality HCI, which combines an EMD centered data preprocessing module and an LSTM prediction module. In the EMD-LSTM model, EMD allows for retaining outliers and utilizing data from non aligned moments, which helps capture data patterns. The powerful nonlinear mapping and learning capabilities of LSTM neural networks enable time series prediction of water quality, and the comprehensive prediction model achieves accurate prediction of water quality in urban drainage networks. LSTM is a special type of RNN that has three more gates than regular RNN, allowing information to selectively pass through. LSTM can perform better in longer sequences, solving the problem of ineffective gradients during RNN training.

文献阅读:综合EMD-LSTM模型在城市排水管网水质预测中的应用

链接:Accurate prediction of water quality in urban drainage network with integrated EMD-LSTM model

现有问题

快速准确地掌握排水管网中的水质,对于城市水环境的管理和预警至关重要。而基于建模的检测方法能够基于廉价的多源数据进行快速且无需试剂的水质检测,这比传统的基于化学反应的检测方法更清洁、更可持续。这些方法只需要很少的参数,并且可以进行更清洁和可持续的水质检测。但其准确性不尽如人意,因此这也限制了在实际上的应用。这一问题可归因于其处理非线性、非平稳水质时间序列的能力较差。

提出方法

在深度学习算法中,LSTM神经网络又因其独特的门结构而特别擅长处理时间序列,使其能够捕获时间序列中的长期依赖关系。使用LSTM神经网络作为建模算法是提高基于建模的水质检测精度的有效途径。该文提出一种融合EMD-LSTM模型,该模型将以经验模态分解(EMD)为中心的数据预处理模块与长短期记忆(LSTM)神经网络预测模块相结合,以提高基于建模的检测方法的精度。由于时间序列相邻值之间的密切关系,非对齐数据是优化对齐时刻数据(即对齐数据)的良好基础。设计一个预处理程序,有效地利用准确的异常值和非对齐数据是必要的。时频变换技术可以将时间序列转换成不同频率的分量。过滤掉代表噪声或对原始数据贡献不大的成分可以减少噪声。这意味着时频变换算法允许保留异常值并通过非对齐数据优化对齐数据。值得一提的是,一些时频变换技术,如短时傅立叶变换(STFT)和小波变换(WT),不适合分析非平稳时间序列。原因是它们的基函数在变换过程中不能改变,而经验模态分解(EMD)有效地克服了这一困难。

EMD-LSTM综合模型

通过多源混频数据集作为测试数据,根据获取数据所需的时间和经济成本,将15个指标分为两部分,LCIs(L1,L2,…,L10)作为模型输入,HCIs(H1,H2,…,H5)作为模型输出。对所有指标进行基本预处理,包括清洗、填充和归一化。但这仅清理了由于仪器故障导致的连续缺失值和异常值。用插值法填充单个缺失值。Min-max归一化方法将所有指标归一化,消除数值差异,如式(1)所示,对每个LCI进行EMD。对于在此分解中获得的分量,代表噪声或具有低贡献的部分被去除。将剩余成分相加,形成优化后的LCIs(L1',L2',…,L10')。在预处理程序结束时,高频指标根据低频指标的频率进行对齐。在移除高频指标之前,将频率对准放置在EMD之后,以确保高频指标中频率不匹配的部分有助于EMD。

(1)

x_{t}表示时间序列中时间t所对应的值,x_{t}{}'表示x_{t}归一化后的值,x_{max}表示时间序列中的最大值,x_{min}表示时间序列中的最小值。

将优化后频率一致的LCI作为“多对一”结构LSTM神经网络的输入。在检验EMD-LSTM模型的性能时,构建了5个结构相同的EMD-LSTM模型,分别预测5个HCI

EMD原理

EMD自适应地将非线性非平稳时间序列分解为几个固有模态函数(IMF)和一个趋势项(即分量)。IMF的数量取决于时间序列本身。该方法的优点是基于时间序列本身的尺度特征实现分解,不需要设置任何基函数。IMF和趋势项是在一个连续的迭代过程中产生的。具体流程可归纳为如下六个步骤:

  1. 找到时间序列x(t)中所有的局部最大值和局部最小值。
  2. 基于三次样条插值理论(cubic spline interpolation theory),将所有的局部最大值和最小值分别连接起来,形成上下包络线(u(t)v(t))。
  3. 通过公式m(t)=[u(t)+v(t)]/2产生平均包络线m(t)
  4. 通过公式h(t)=x(t)-m(t)产生差异h(t)
  5. 检查h(t)是否满足IMF条件(a)和(b)。(a)极值点的个数和过零点的个数必须等于或最多相差一个;(b)在任何时刻t,由局部最大值组成的上包络和由局部最小值组成的下包络的平均值均为零。
  6. 如果不满足IMF的条件,h(t)被视为时间序列x(t),并重复步骤1至步骤5,直到h(t)更新到满足两个条件。满足两个条件意味着这个h(t)将是第一个IMF(c_{1}(t)),然后根据公式r_{1}(t)=x(t)-c_{1}(t)产生第一个残差r_{1}(t)来替换掉时间序列x(t),接着重复步骤1至步骤5,迭代生成剩余的n个IMF。

连续迭代,直到r_{n}(t)满足标准差小于0.25,则r_{n}(t)趋势项。如公x(t)=\sum_{i=1}^{n}c_{i}(t)+r_{n}(t)所示,时间序列x(t)最后通过EMD分解为n个IMF和一个趋势项的和。

研究框架

将数据集分为训练集(2019-10-26 ~ 2019-11-20,25 d)和测试集(2019-11-21 ~ 2019-11-26,6 d),分割比例为4:1。结合传统的预处理模块和预测模块构建了其他集成模型,与EMD-LSTM集成模型进行对比。设计了一系列的对照实验来测试所提出的EMD-LSTM的性能并分析其产生的原因,主要分为五个部分:

  1. 比较不同数据预处理程序对预测精度的影响
  2. 比较不同预测算法对预测精度的影响
  3. 分析不同数据预处理程序对数据集的优化效果
  4. 验证保留异常值对预测精度的影响
  5. 验证利用非对齐数据对预测精度的影响

集成模型的性能评价

1、预处理模块比较

构建EMD-LSTM、to - lstm、STFT-LSTM,比较不同预处理模块对预测精度的影响。采用SMAPE、判定R2、RMSE评价EMD-LSTM模型的预测性能。SMAPE该统计度量可以反映预测结果与实测值之间的相对偏差程度。RMSE表示实测值与预测结果的绝对差值,R2可以反映实测值的波动可以被模型预测值解释的程度。结果表明,STFT和EMD在时间序列预处理过程中确实可以提高预测结果的精度。

 2、预测模块比较

测试了EMD预处理模块与传统数据驱动预测模块相结合的效果。在综合EMDLSTM模型中,使用PLSR、GBR、DNN作为预测模块替代LSTM,4种预测模块的性能表现为LSTM > DNN > GBR > PLSR。即RNN架构和门结构带来的记忆能力使LSTM更适合处理时间序列问题

结论

与传统数据预处理程序(即TO、STFT)和数据驱动预测算法(即PLSR、GBR、DNN)形成的集成模型相比,EMD-LSTM集成模型在预测hci方面表现最佳。在数据预处理过程中应用时频变换算法提高了预测精度,EMD算法的预测效果优于STFT算法。保留的异常值有助于保持原始时间序列的完整性,这使得LSTM神经网络能够更好地捕获数据模式(R2高0.87-1.73%)。在高频指标中,非对齐数据正有助于优化对齐数据,提高后续LSTM神经网络的准确率(R2提高0.27 ~ 0.54%)。良好的精度(R2≥0.94)使得集成EMD-LSTM模型适合实际应用中的水质检测。

Long Short-term Memory(长短期记忆)

1. LSTM的结构

LSTM是一种特殊的RNN,比普通的RNN多了三个“门”,可以让信息有选择性的通过。当一条序列很长的时候,RNN很难将从一开始的信息传送到后面的时间点,而LSTM能够学习长期依赖的信息,记住早时间点的信息,更好的联系上下文。

099fcba55e8e4db2b21655eed84ce7db.png

Input Gate:控制input数据输入

Forget Gate:控制是否保存中间结果

Output Gate:控制output数据输出

eq?x%5E%7Bt%7D乘上一个matrix变成向量eq?zeq?x%5E%7Bt%7D再分别乘以一个transform得到eq?z_%7Bi%7Deq?z_%7Bo%7Deq?z_%7Bf%7D,它们的维数跟LSTM的数量一样,eq?z的每一维的数值分别代表每个LSTM的input,eq?z_%7Bi%7Deq?z_%7Bo%7Deq?z_%7Bf%7D的每一维操纵一个LSTM的Input Gate、Output Gate、Forget Gate。

26243fa67ef74991bb52be6b418be65f.png

输入:eq?z

输出门控制信号:eq?z_%7Bo%7D

输入门控制信号:eq?z_%7Bi%7D

遗忘门控制信号:eq?z_%7Bf%7D

激活函数基本都是sigmoid函数,值域在0和1之间,函数值决定所控制门的开关程度,值越大,门打开程度越大。如果eq?z_%7Bf%7D为0,这说明存在memory中的数值不能被读取出来。Input Gate与Output Gate的开与关是由network进行学习后自行决定的,对memory里的哪些值进行forget也是由network自行学习的。

51adc116b817415eb4e770f4e523c39b.png

 将LSTM当做一个特殊的神经元,但是从图中可以看出LSTM比普通的神经元多了三个门,每个门都需要相应的参数,因此LSTM需要的参数量相当于普通神经元的4倍。

05d5ab371484405da3a419708bf126ef.png

其实就是原来简单的neuron换成LSTM。

47362115f8454d098ebdb61a468ac4cb.png

2. Multiple-layer LSTM

真正的 LSTM在输入的时候还会把 hidden layer 的输出eq?h%5E%7Bt-1%7D 接上,还会加上上一个时间点 memory cell 的值 eq?c%5E%7Bt-1%7D ,再在经过不同的 transform 得到四个不同的 z vector 去控制 LSTM,LSTM 也不止一层,可以叠多层。
622aed486e674649a9bd21b4bc587d96.png

3.3 LSTM Example

当​eq?x_%7B2%7D%3D1​的时候,将eq?x_%7B1%7D的的值添加到memory;

eq?x_%7B2%7D%3D-1的时候,将memory中的值移除;

eq?x_%7B3%7D%3D1的时候,输出memory里的值。

58bf495787b244d7b4769e3bab648b69.png

 以第一个序列为例,设置输入门eq?x_%7B2%7D的权重为100,偏差值为1权重为-10,也就是当eq?x_%7B2%7D的值小于0.1即小于0,那么通过sigmoid函数之后输入门的值就接近0,代表门被关闭,否则可以将eq?x_%7B1%7D的值存入memory,同理可知输出门和遗忘门的权重设置,但遗忘门的偏差为10,通常是被打开的,只有当eq?x_%7B2%7D的值为一个很大的负数的时候才会被关闭。序列1输入,memory存的值不变,并且输出门值为0不输出,序列2输入将eq?x_%7B1%7D的值3保存到memory,但输出门为0,memory的值不输出,序列3输入,将将eq?x_%7B1%7D的值4保存到memory,此时memory的值为3+4=7,输出门不为0,输出memory中的值7。

94c4943783a740ca8d681ef8bc4513d6.png

3. GRU

LSTM是RNN的升级版,加了门控装置,解决了长时记忆依赖的问题。但由于参数量复杂,带来了计算量增加,所以引进了简化版的LSTM,即GRU。

GRU在LSTM的基础上减少了一个门,即用更新门代替了遗忘门和输出门,其参数更少,训练相对简单一点。而从效果上说,二者并没有优劣之分,取决于具体的任务和数据集而定。实际上来讲,二者的表现差距往往不大,远远没有调参效果明显。

LSTM实现PM2.5预测

数据集:Beijing PM2.5 Data

import torch
import torch.nn as nn
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler# # 打印出Seaborn库中内置的所有数据集列表
# datasets_name = sns.get_dataset_names()
# print("ALL DATASET:", datasets_name)
#
# # 加载航班数据集
# flight_data = sns.load_dataset("flights")
# flight_data.head()data = pd.read_excel('../DataSet/PRSA_data_2010.1.1-2014.12.31(Updated_data).xlsx')
# print(data, type(data))# 将 PM2.5 列的数据改为浮点型存入 all_data 中
all_data = data['PM2.5'].values.astype(float)# 将列 TIME-HOUR 转换为日期格式
data['TIME-HOUR'] = pd.to_datetime(data['TIME-HOUR'])# data 的列类型是对象
# print(data.head(), data.shape, data.columns)
# data 是一个 numpy 二维数组
# print(data)# 划分33824个训练集和10000测试集
test_data_size = 10000
train_data = all_data[:-test_data_size]
test_data = all_data[-test_data_size:]
# print(len(train_data))
# print(len(test_data))# 归一化,注意 fit_transform 方法的输入必须是一个二维的数组
# 训练集和测试集不要一起归一化,就是说不要先归一化再划分数据集,先将数据集划分后再分别进行归一化
scaler = MinMaxScaler(feature_range=(-1, 1))
train_data_normalized = scaler.fit_transform(train_data.reshape(-1, 1))
test_data_normalized = scaler.fit_transform(test_data.reshape(-1, 1))
# 印出归一化训练数据的前5条和后5条记录
# print(train_data_normalized[:5])
# print(train_data_normalized[-5:])# 将数据集转换为张量
train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)
test_data_normalized = torch.FloatTensor(test_data_normalized).view(-1)
# print(train_data_normalized)# 将训练数据转换为序列和相应的标签
# 可以使用任何序列长度,取决于领域知识,比如说数据是按月份收集的就将序列长度设为12(一年12个月),如果数据是按天数收集的就将序列长度设为365(一年365天)
# 本数据集是按小时收集的,所以设定序列长度为 30 * 24 (按月来设定窗口)
train_window = 30 * 24# 定义一个名为create_inout_sequences的函数
# 该函数将接受原始输入数据,并返回一个元组列表
# 在每个元组中,第一个元素将包含 30 * 24 个项目的列表,对应于前1个月内每个小时的 PM2.5 的排放量,第二个元素将包含一个项目的列表即第2个月的第一个小时的 PM2.5 的排放量
def create_inout_sequences(input_data, tw):inout_seq = []L = len(input_data)for i in range(L-tw):train_seq = input_data[i:i+tw]train_label = input_data[i+tw:i+tw+1]inout_seq.append((train_seq, train_label))return inout_seq
# 创建训练序列
train_input_seq = create_inout_sequences(train_data_normalized, train_window)
# print(train_inout_seq[:5])class LSTM(nn.Module):# input_size:对应于输入中特征的数量,数据集中只有 PM2.5 这一个特征# hidden_layer_size:指定隐藏层的数量以及每层神经元的数量# output_size:输出中项目的数量,本项目中只预测未来一个小时内的 PM2.5 的量,因此输出大小将为1def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):super().__init__()self.hidden_layer_size = hidden_layer_sizeself.lstm = nn.LSTM(input_size, hidden_layer_size)self.linear = nn.Linear(hidden_layer_size, output_size)# self.hidden_cell:这是 LSTM 层的隐藏状态# LSTM 层是一种循环神经网络(RNN),它在处理序列数据时会维护一个隐藏状态,用于捕获序列中的时间相关性# input_seq:这是输入到 LSTM 层的数据序列# 在这里,input_seq 被视为一个三维张量,其形状为 (sequence_length, batch_size, input_size)# 其中 sequence_length 表示序列的长度,batch_size 表示批次大小,input_size 表示输入特征的数量# view(len(input_seq), 1, -1):这是一个 PyTorch 的操作,用于重新排列输入张量的维度# 具体来说,它将输入张量的维度从 (sequence_length, input_size) 重新排列为 (sequence_length, 1, input_size)# 这是因为 LSTM 层期望输入数据具有这种形状,其中第二个维度通常用于批次大小,这里 1 表示批次大小为 1# lstm_out 的形状为 (sequence_length, batch_size, hidden_size)# 预测出来的 PM2.5 的量存储在 predictions 列表中最后一个项目中,并返回给调用函数def forward(self, input_seq):lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)# print(lstm_out.shape)predictions = self.linear(lstm_out.view(len(input_seq), -1))return predictions[-1]# 创建 LSTM() 类对象、定义损失函数和优化器
# 损失函数:交叉熵损失
# 优化器:Adam
model = LSTM()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# print(model)# 模型训练
epochs = 1for i in range(epochs):for seq, labels in train_input_seq:optimizer.zero_grad()# 初始化LSTM模型的隐藏状态和细胞状态model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),torch.zeros(1, 1, model.hidden_layer_size))y_pred = model(seq)single_loss = loss_function(y_pred, labels)single_loss.backward()optimizer.step()# {i:3} 是一个占位符,它表示要在这个位置插入一个整数 i,并且将其格式化为占据3个字符的宽度# 这意味着无论 i 是多少,都会占据3个字符的位置,不足的部分用空格填充# {single_loss.item():10.8f} 是另一个占位符,它表示要在这个位置插入一个浮点数 single_loss.item(),并将其格式化为占据10个字符的宽度# 其中包括小数点和8位小数,这会以固定的宽度显示损失值print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')# 模型泛化
test_input_seq = create_inout_sequences(test_data_normalized, train_window)
predictions = []
for seq, labels in test_input_seq:with torch.no_grad():model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),torch.zeros(1, 1, model.hidden_layer_size))prediction = model(seq)predictions.append(scaler.inverse_transform(np.array(prediction).reshape(-1, 1)))print(len(predictions), type(predictions))
print(len(test_data[train_window:]), type(test_data[train_window:]))
print("------------------------------------------------------")# 创建x轴的值(可以是范围或自定义值)
x_values = np.arange(len(predictions))# 匹配 prediction 与 test_data[train_window:] 的维度
predictions = np.array(predictions)
print(predictions.shape)
print(test_data[train_window:].shape)
print("------------------------------------------------------")
print(predictions.reshape(-1))
print(test_data[train_window:])# 绘制预测值的图形
plt.plot(x_values, predictions.reshape(-1), label='Forecast values', linestyle='-', color='red', marker='')# 绘制真实值的图形
plt.plot(x_values, test_data[train_window:], label='True Values', linestyle='-', color='blue', marker='')# 添加图例
plt.legend()# 设置图形标题和轴标签
plt.title('True vs. predicted values')
plt.xlabel('Time')
plt.ylabel('PM2.5')# 显示图形
plt.show()

原始数据图像:

测试集预测数据图像:(受限于设备性能,epoch次数很少,导致测试结果很差)

总结

这周学习了RNN以及LSTM,不同于以往CNN等结构,RNN在全连接网络上加上了记忆功能,基础的神经网络只是在层与层之间建立了权值连接,而RNN在层之间的神经元之间也建立了权值连接,它能够处理序列变化的数据。而LSTM又在RNN的基础上加上了记忆定义的概念,在RNN中只会针对比较短的序列进行操作,而比较长的序列一般使用LSTM,LSTM适合处理序列中间间隔和延迟相对较长的问题,解决在长序列训练过程中梯度消失的问题,例如聊天机器人、语音识别等。

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

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

相关文章

不再兼容“安卓“,鸿蒙开发与android对比

首先,鸿蒙系统采用了分布式技术,其设计理念是“能用分布式解决的问题就不用单机解决”。这意味着鸿蒙旨在构建一个统一的分布式操作系统,可以支持不同设备之间的交互和通信。 而安卓系统基于Linux内核和Java编程语言构建,属于单机…

使用Nacos作为配置中心

Nacos配置中心简介 首先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散 在各个微服务中,不好统一配置和管理。配置文件无法区分环境…

GZ029 智能电子产品设计与开发赛题第8套

2023年全国职业院校技能大赛高职组 “GZ029智能电子产品设计与开发”赛项赛卷八 题目:模拟工业传送带物品检测系统的设计与开发 1 竞赛任务 在智能电视机上播放工业传送带传输物品视频,模拟工业传送带物品检测系统(以下简称物品检测系统&…

16ASM 汇编基础与Debug使用

目录 硬件运行机制 微机系统硬件组成 计算机系统组成 8086CPU组织结构 DoxBox安装 Debug使用 R命令 D命令 E命令 U命令 T命令 A命令 标志寄存器 常用机器指令 硬件运行机制 下面是一个电子器件二极管,正向加电则通,反向加电则不通 利用二…

西南交通大学【数据结构实验8】

实验内容及要求: 编写控制台应用程序,提供以下菜单项: 插入元素 从键盘输入若干两两互不相同的非0整数,直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时,若该整…

不需要联网的ocr项目

地址 GitHub - plantree/ocr-pwa: A simple PWA for OCR, based on Tesseract. 协议 mit 界面 推荐理由 可以离线使用,隐私安全

JAVA全栈开发 JDBC、反射、设计者模式

一、JDBC 【1】JDBC概述 1.1什么是jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成。通过这些类和接口,JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。 1.2jdbc的作用 提供j…

深度探索Linux操作系统 —— 构建桌面环境

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

Quartus II + Modelsim 脚本仿真

软件版本:Intel Quartus Prime Design Suite: 23.2 方式参考附件Intel 官方文档:Questa*-Intel FPGA Edition Quick-Start: Intel Quartus Prime Pro Edition 第1步,创建一个ram ip,并形成一个例化的top层ip 第2步,自…

免费图片无损放大:8大平台突破画质极限

之前介绍过图片提高清晰度的工具平台,这次AIGCer介绍下将图片无损放大的几个在线免费的工具平台。图片高清放大是一种处理低分辨率图像的方法,以增加图像的尺寸和细节,使其看起来更大、更清晰。 1.美图设计室 传送门:https://ww…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1)数据介绍2)数据测试3)数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客,在读者…

什么是Z-Wave,技术特点,各国支持的频段

1.1 背景 Z-Wave是一种无线通信的协议,主要应用于智能家居网络,而其Z-Wave联盟主要是推动家庭自动化领域采用Z-Wave协议,其联盟成员都是智能家居领域非常有名的厂商,基本上覆盖了全球。 2.1 技术特点 低功耗、高可…

BigDecimald简单使用

为什么要用BigDecimal运算 在计算浮点型数据时,往往会存在数据计算失真问题 例1 2.0 - 1.9 应该等于0.1,用float类型赋值运算得出的结果为0.100000024,有问题 例2 1.8 - 1.9 应该等于 -0.1,用double类型赋值得出的结果为-0.09999999999999987,明显有问题 BigDecimal使用 BigDec…

用23种设计模式打造一个cocos creator的游戏框架----(十四)观察者模式

1、模式标准 模式名称:观察者模式 模式分类:行为型 模式意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 结构图: 适用于:…

网神 SecGate 3600 防火墙 多处任意文件上传漏洞复现

0x01 产品简介 网神SecGate 3600防火墙是基于状态检测包过滤和应用级代理的复合型硬件防火墙,是专门面向大中型企业、政府、军队、高校等用户开发的新一代专业防火墙设备,支持外部攻击防范、内网安全、网络访问权限控制、网络流量监控和带宽管理、动态路由、网页内容过滤、邮…

【Jeecg Boot 3 - 第二天】1.2、jar 包和 lib 依赖分离,部署包缩小100倍

一、场景 二、思路 三、实战 ▶ 2.1、项目 jar 包解压获取 lib config Stage 1:正常打包获取 jeecg-system-start-3.6.0.jar Stage 2:解压 获取如下文件 Stage 3:获取 lib config ▶ 2.2、获取简化版项目jar包 Stage 1&#xff1…

AI+无代码助力企业供应链优化

内容来自演讲:潘峰 | 预见明日科技(北京)有限公司 | CEO 摘要 本文介绍了企业供应链中的挑战和解决方案。文章指出,供应链成本占企业经营成本的大部分,且存在供给端和需求端的高度不确定性。为应对这种不确定性&…

【深度学习】注意力机制(二)

本文介绍一些注意力机制的实现,包括EA/MHSA/SK/DA/EPSA。 【深度学习】注意力机制(一) 【深度学习】注意力机制(三) 目录 一、EA(External Attention) 二、Multi Head Self Attention 三、…

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

简述:ActiveMQ的fileserver支持写入文件(但是不支持解析jsp),同时也支持移动文件。所以我们只需要先上传到服务器,然后再移动到可以解析的地方即可造成任意文件写入漏洞。我们可以利用这个漏洞来上传webshell或者上传定时任务文件。 漏洞复现 启动环境 …

stm32 HAL库 发送接受 到了一定的字符串后就卡在.s文件中

问题介绍: 某个项目开发过程中,串口接收中断,开启了DMA数据传输,开启了DMA中断,开启DMA半满中断。然后程序运行的过程中,接收了一部分数据后就会卡在启动文件的DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler 中断里。…