☰
基于LSTM与RBF-BP的火灾预测:多源传感融合与深度学习实现
2026/9/29 7:30:10 网站建设 项目流程

简介:一份PDF格式的学术论文原文,发表于《齐鲁工业大学学报》2020年第34卷第3期,作者为许春芳、乔元健、李军,面向深度学习、数据分析及火灾预警系统研发的科研人员和工程师。论文针对火灾信号时变性强、非线性明显以及单特征信号预测易漏报误报的问题,提出LSTM与RBF-BP混合的多源信息融合火灾预测方法:先以多种传感器采集温度、烟雾、CO浓度等火灾特征,经速率检测算法预处理,再由LSTM和RBF-BP神经网络自适应学习,输出有火、无火、阴燃火三种火型的发生概率,最终通过模糊逻辑控制系统完成有无火灾的判定。全文PDF共1个文件,压缩包约6.86MB,当前已有565人学习浏览,适合作为算法设计、仿真实验与论文写作的参考文献。

1. 基于LSTM和RBF-BP深度学习模型的火灾预测方法:一套把多源传感信号变成火警概率的完整方案

火灾信号是典型的时变非线性序列,温度、烟雾浓度、CO浓度三条曲线在阴燃、明火、无火三种状态下的变化模式完全不同。只用单一传感器特征做判决,漏报和误报几乎是必然的——这也是很多传统火灾预警系统的通病。这篇论文提出的思路是:先用LSTM啃时间序列的长期依赖,再把LSTM的输出交给RBF-BP混合网络做三种火型概率的精细拟合,最后用模糊逻辑去兜底决策。整套方法在国家标准试验火数据集上把有火概率的均方根误差压到了0.022,测试速度也跑进3.3秒。对正在做智能消防预警、多传感器融合检测的从业者来说,这份文档的价值在于它给出了一套可以直接落地的特征层融合结构,不光是理论叙述,算法公式、网络设计和实验对比都齐全,照着复现能省不少自己摸索的时间。

2. 信息层到特征层:速率检测预处理与三源信号的选择逻辑

2.1 为什么单特征模型必然翻车,多源融合又该怎么设计

火灾信号有一个让人头疼的特性:时间上高度时变,空间上非线性强。一个电热毯短路引燃床垫的场景里,温度曲线可能前几分钟平缓上升,然后突然陡增,烟雾浓度和CO浓度的响应速度又各不相同。如果只看单一特征——比如只盯温度——阴燃阶段的温度变化可能还没超过阈值,真正危险的信号藏在烟雾和CO里,等温度冲上来再报警,留给疏散的时间就很少了。

论文里把这个问题归结为单特征信号火灾预测方法的高漏报率和高误报率,这个判断我深有体会。曾经我调试过一套只用温升速率做判决的消防系统,仓库里有台电焊机误触发了三次报警,而真正的一次阴燃火源反而因为温升不够快漏掉了。系统结构上用三组传感器并行采集CO浓度信号、烟雾浓度信号和温度信号,信息层做滤波、除噪、归一化预处理,特征层交给神经网络做自适应学习,决策层用模糊控制输出最终判断。这个三层结构里最容易被忽略的是信息层的局部决策环节——它在数据进入深度学习模型之前就做了一道筛查,能把大量无异常的平稳数据挡在门外,避免无效计算量堆积。

2.2 速率检测算法的数学拆解与Python实现

速率检测算法的核心思想很直白:在设定的时间段内,如果某种传感器的信号变化速率超过了阈值,就判定这个信号异常,进而触发后续的神经网络推理。它分为两步,第一步算累计变化量,第二步做门限判决。

import numpy as np def rate_detection(signal_segment, threshold=0.15): """ 速率检测:对传感器信号段做累计变化量计算与门限判决 :param signal_segment: 该时间段内的信号采样数组,长度 N :param threshold: 异常变化阈值,论文实验常用 0.1~0.2 :return: 1 表示异常,0 表示正常 """ n = len(signal_segment) # 论文公式(1):P = sum(|x(i+1) - x(i)| * dt, i=1..n-1) diff_sum = np.sum(np.abs(np.diff(signal_segment))) # 论文公式(2):B = f(P - YT),f 为阶跃判决 decision = 1 if diff_sum > threshold else 0 return decision # 三路信号分别做局部决策 co_signal = np.random.randn(20) * 0.1 + 0.5 # 模拟 CO 浓度信号 smoke_signal = np.random.randn(20) * 0.15 + 0.4 # 模拟烟雾浓度信号 temp_signal = np.random.randn(20) * 0.3 + 28.0 # 模拟温度信号 decisions = [ rate_detection(co_signal, threshold=0.12), rate_detection(smoke_signal, threshold=0.18), rate_detection(temp_signal, threshold=0.25) ] # 三个决策中任一为 1,则触发神经网络推理 if any(decisions): print("触发特征层推理,将三组信号送入 LSTM + RBF-BP 模型") else: print("信号平稳,继续本地缓存,不启动模型")

代码里的np.diff直接完成了相邻采样点的差值计算,再取绝对值求和就得到了论文公式中的 P 值。阈值不是一拍脑门定的,它取决于传感器的采样频率和安装环境:采样频率越高,相邻点差值越小,阈值可以适当调低;环境本身有规律的波动,阈值就得调高一些防止误触发。这个预处理的妙处在于,它把深度学习模型从「每时每刻都要跑」变成了「只有异常苗头才跑」,计算资源的消耗能减少一个数量级。

2.3 三组特征为什么选 CO、烟雾和温度,选型依据是什么

论文选这三路信号是有讲究的。CO浓度是燃烧不完全的标志性产物,阴燃阶段就会产生明显的CO上升;烟雾浓度对可见烟颗粒最敏感,明火之前的烟缕能最早被探测到;温度是最保守的指标,明火阶段才有剧烈变化,但它最可靠,不易被水蒸气或灰尘干扰。三路信号的响应时间轴是错开的:烟雾最早、CO其次、温度最后。把它们放一起做融合,等于从三个时间维度去捕捉火灾的早期特征,比任何单一信号都有更长的预警时间窗口。

我在实际工程里还会加一路感烟式探测器的差分信号做验证,但这需要额外的硬件支持。论文里的三路信号结构已经覆盖了最典型的火灾特征,硬件成本也适中,做智能楼宇改造时可以直接对接现有的传感器节点。

2.4 信号归一化时容易踩的暗坑

把三路信号直接拼在一起送进网络之前,归一化是必须做的。CO浓度的量纲是 ppm,烟雾浓度是 obscuration/m,温度是摄氏度,三者数值范围差距可能达到两个数量级。如果不做归一化,梯度更新会被量纲大的特征主导,LSTM 的收敛速度会异常慢,甚至出现损失震荡。

常见做法是各自做 Min-Max 归一化,把每路信号压到 [0,1] 区间。但要注意一个细节:归一化的上下界应该从训练集的全局统计确定,而不是对每一条样本单独做。否则测试阶段会出现「新样本的最大值超过了训练时见过范围」的问题,预测结果直接失真。论文里提到实验数据做了乱序重排预处理,目的也是为了让训练集的统计特征更稳健,避免相邻样本之间存在时序相关性干扰归一化参数的估计。

3. 特征层的第一棒:LSTM 如何处理火灾时间序列

3.1 从 RNN 到 LSTM,为什么循环神经网络的长期记忆是硬伤

火灾特征信号在时间维度上是连续的,前后状态之间存在强相关。比如阴燃阶段的温度缓慢爬升,这个趋势信息对判断后续是否会转为明火至关重要。普通的 RNN 在理论上有能力捕获这种依赖,但实际训练中梯度在反向传播时随时间的回溯会指数级衰减——梯度消失——导致网络记不住几十个时间步之前的信息。

LSTM 的破解思路是在原始 RNN 的隐藏状态之外,增加了一条单元状态 C(t) 的传输线。这条传输线贯穿整个时间序列,信息在上面流动时可以不做剧烈变换,由遗忘门、输入门、输出门三个门控结构决定何时写入、丢弃和输出信息。门控机制让梯度可以沿着 C(t) 这条通道顺畅地回流,从根源上缓解了长期依赖问题。论文的结构图里,LSTM 是特征层的第一个子网络,它的输出不是最终判决,而是作为 RBF-BP 混合网络的输入,这种串行级联的设计让 LSTM 专注做时间特征的提取,分类判别交给后面更擅长拟合复杂非线性关系的混合网络。

3.2 LSTM 三门控的公式推演:遗忘门、输入门、输出门具体在算什么

LSTM 的计算过程可以用一组递推公式描述,每个时间步 t 都执行相同的运算。设 x(t) 是当前时刻输入的三维火灾特征向量,h(t-1) 是上一时刻的隐藏状态,C(t-1) 是上一时刻的单元状态。

import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) def lstm_cell(x_t, h_prev, C_prev, W_f, b_f, W_i, b_i, W_c, b_c, W_o, b_o): """ 单个 LSTM 单元的前向计算 x_t: 当前时刻输入,形状 (3,) h_prev: 上一时刻隐藏状态 C_prev: 上一时刻单元状态 各 W 为对应门的权重矩阵,b 为偏置 """ # 遗忘门:决定上一时刻单元状态信息被遗忘的程度 f_t = sigmoid(np.dot(W_f, np.concatenate([h_prev, x_t])) + b_f) # 输入门的两部分:决定新信息写入的程度和候选值 i_t = sigmoid(np.dot(W_i, np.concatenate([h_prev, x_t])) + b_i) C_tilde = np.tanh(np.dot(W_c, np.concatenate([h_prev, x_t])) + b_c) # 更新单元状态:旧状态按遗忘门衰减,加上新候选按输入门写入 C_t = f_t * C_prev + i_t * C_tilde # 输出门:控制当前单元状态信息输出到隐藏状态的多少 o_t = sigmoid(np.dot(W_o, np.concatenate([h_prev, x_t])) + b_o) h_t = o_t * np.tanh(C_t) return h_t, C_t

这段代码完整对应了论文里的公式(3)到公式(8)。遗忘门的核心是 sigmoid 函数输出 0 到 1 之间的系数,乘到旧的单元状态上,系数接近 0 表示该遗忘,接近 1 表示该保留。输入门决定新信息的写入强度,候选单元状态 C_tilde 用 tanh 生成,保证值域在 [-1,1] 之间,避免数值爆炸。输出门则控制当前时间步对外暴露多少内部状态。三个门控的权重矩阵都是训练时通过反向传播学习出来的,不需要人为设计规则,这也是深度学习相对传统阈值判别法的核心优势。

3.3 第一层 50 节点、第二层 100 节点:论文参数怎么理解

论文在 TensorFlow 框架下搭建 LSTM 网络,设计了两层结构,第一层 50 个节点,第二层 100 个节点,激活函数选用 sigmoid。这个参数设置的背后逻辑值得展开说:第一层节点数相对较少,相当于先做一次时间特征的粗提取,把三通道输入映射到 50 维的特征空间;第二层节点数翻倍,是为了给 RBF-BP 混合网络提供更高维度的输入特征,让后续的拟合有足够的表达空间。

节点数不是越多越好。层数加深或节点增加,模型参数量同步上涨,在只有 400 组训练数据的体量下很容易过拟合。论文里训练集 400 组、测试集 80 组,这个数据规模决定了网络不宜过深。我在自己的项目里复现过类似的设置,如果把两层节点各扩到 200,训练损失曲线确实会降得更快,但测试集上的均方根误差反而升高了——典型的过拟合信号。节点数是需要根据数据量权衡的,论文的 50/100 组合提供了一个不错的基线,新手可以照搬,数据量大的场景再逐步加节点观察验证集误差变化。

3.4 损失曲线的判读方法:什么时候算训练完成

LSTM 网络训练时,TensorFlow 会输出每个 epoch 的 loss 值。论文里展示了三路信号的损失曲线,CO 浓度信号大约在 150 个周期内快速下降,到第 300 个周期左右趋于平稳;烟雾和温度的收敛曲线形态类似。判断训练是否完成的标准不是看 loss 降到了多少,而是看它在验证集上是否开始回升——也就是过拟合的临界点。

实操中我会把训练数据分成两份,80% 做训练,20% 做验证,每个 epoch 结束后记录验证集损失。当验证损失连续 20 个 epoch 不再下降甚至开始上升时,就停止训练并回滚到验证损失最低的那个 checkpoint 权重。论文中的 400 次迭代周期是一个安全范围,实际执行时用早停策略可能到不了这么多就收敛了,这不算异常,反而说明模型容量和数据规模匹配得比较好。

4. 特征层的第二棒:RBF-BP 混合网络的结构与拟合优势

4.1 单 BP 和单 RBF 各自的弱点,混合之后为什么更强

BP 神经网络作为经典的前馈网络,理论上可以拟合任意连续函数,激活函数选用 S 型函数,通过反向传播算法更新权重。它的短板是收敛过程容易陷入局部最小值——梯度下降沿着负梯度方向走,可能被卡在某个局部低点出不来,全局最优解可能差得很远。RBF 网络是三层结构,激活函数用高斯基函数,有很强的局部逼近能力和泛化能力,训练精度也优于普通 BP,但它对测试数据的预测准确率不够稳定。

混合的思路是把两种网络做串行融合:BP 的输出作为 RBF 的输入,前者的全局逼近能力先做一版预测,后者的局部精细拟合再做修正。这种结构让混合网络同时拥有 BP 对全局趋势的把握能力和 RBF 对局部细节的贴近能力。论文图 3 里的 RBF-BP 结构,隐含层设计为 k 层,激活函数选用 sigmoid;输出层为一层,激活函数选用高斯基函数。两个子网络不是简单的并联,而是前一个的输出直接喂给后一个,级联结构让特征经过两次非线性变换,分类边界可以刻画得比任何单一网络都精细。

4.2 RBF-BP 前向传播公式与反向更新逻辑

前向传播阶段,每个节点的输出等于权重矩阵乘以上一层输出再加偏置项,经过激活函数得到当前层的输出。写成代码比看公式更直观:

import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) def rbf_gaussian(x, centers, sigma): """ RBF 高斯基函数:计算输入样本到每个中心点的径向距离 """ distances = np.linalg.norm(x - centers, axis=1) return np.exp(-distances**2 / (2 * sigma**2)) def rbf_bp_forward(x, W_bp, b_bp, W_rbf, centers, sigma): """ RBF-BP 混合网络前向传播 x: LSTM 输出的特征向量 W_bp: BP 层权重 W_rbf: RBF 输出层权重 """ # BP 子网络:全连接 + sigmoid 激活 h_bp = sigmoid(np.dot(W_bp, x) + b_bp) # RBF 子网络:以 BP 输出为输入,经高斯基函数扩展 rbf_out = rbf_gaussian(h_bp, centers, sigma) # 输出层:线性加权得到三种火型概率 final_out = np.dot(W_rbf, rbf_out) return final_out

反向传播阶段的核心是权重和偏置的更新,论文明确优化器选用最速下降法,损失函数选用均方根误差函数。均方根误差的公式是:先对每个样本计算真实值与预测值的差平方,求和后取平均再开方。相比均方误差,它对大误差更敏感,能放大器偏大的预测偏差,迫使模型优先修正那些偏离严重的样本。

rimeBP 子网络的权重更新遵循标准反向传播算法,逐层计算误差对权重的偏导数;RBF 子网络的训练则要额外更新基函数的中心和宽度参数,这两组参数同样用梯度下降做迭代优化。混合网络的训练流程可以这么理解:BP 部分先把输出大致调到正确区域,RBF 部分再在局部做精修。两者协同收敛的速度比各自单独训练快,这正是表 1 里测试时长能压缩到 3.2 秒的原因之一。

4.3 三种火型概率输出:有火、无火、阴燃火的分布怎么理解

网络输出层设计为三个节点,分别对应有火概率、无火概率和阴燃火概率。很多人第一次看会觉得这不是一个标准分类问题吗——用 softmax 直接出三个类别的概率不就行了。但论文特意强调用三路输出去拟合概率值,而不是做互斥的类别判断,原因在于阴燃和有火之间存在过渡状态,样本的标签本身就有模糊性。用三个独立的概率值输出,模型可以表达「当前状态有 60% 概率是阴燃火、30% 概率已转为有火」这种渐变信息,为决策层的模糊逻辑系统提供更丰富的输入。

从损失函数的设计也能看出这个意图。均方根误差把三路输出当作三个回归目标来优化,而不是用交叉熵这类分类损失。这意味着训练好的模型输出的不是一个硬分类结果,而是三个独立的置信度评分,后续怎么综合这三个评分做出最终报警判断,完全交给模糊逻辑控制系统去完成。这种「回归式分类」的策略在信号渐变场景下比 softmax 更合理,因为它不强迫模型在临界状态二选一。

4.4 RBF 中心和宽度参数的初始化

RBF 网络中高斯基函数的中心点位置和宽度(sigma)对精度影响很大。常见做法是从训练数据中随机选取若干样本作为初始中心,sigma 则根据中心之间的平均距离估算。我在复现论文这个结构时用的是 K-Means 聚类来初始化:

from sklearn.cluster import KMeans def init_rbf_params(h_bp_train, n_centers=64): """ 用 K-Means 聚类初始化 RBF 中心和宽度 h_bp_train: BP 层输出的训练特征矩阵 n_centers: 中心点数量 """ kmeans = KMeans(n_clusters=n_centers, random_state=42).fit(h_bp_train) centers = kmeans.cluster_centers_ # 宽度 sigma 取每个中心到最近邻中心的平均距离 from sklearn.metrics import pairwise_distances dist_matrix = pairwise_distances(centers, centers) np.fill_diagonal(dist_matrix, np.inf) sigma = np.min(dist_matrix, axis=1) * 0.5 return centers, sigma

中心点数量是另一个需要调节的参数。论文实验里没有明说隐层中心数,但按照 400 组训练数据、三路输出的规模,64 个中心点是一个合理的起点。中心点太少,RBF 的局部拟合能力发挥不出来;中心点太多,参数数量暴增,训练集上表现很好、测试集上严重失真的风险也会上升。初调代码时可以先跑一组中心点数量从 16 到 128 的对比实验,以测试集均方根误差为选择标准确定最终值。

5. 火灾预测模型避坑指南:从数据预处理到网络训练的血泪经验

5.1 现象:归一化后模型收敛特别慢,loss 曲线反复震荡不下降

原因:三路信号用了全局统一的 Min-Max 归一化,但 CO 浓度大部分时间在 0 到 5 ppm 之间波动,只有极端情况才冲到 50 ppm。全局归一化把正常的细微变化压缩到了接近于零的区间,LSTM 的输入特征在多数时间步上几乎一模一样,梯度更新信号极弱。

解决:对每路信号单独做统计归一化,使用各自的均值和标准差做 Z-score 标准化。CO 浓度和烟雾浓度的分布特征差异很大,分开处理后模型的输入信号保有了各自独立的变化幅度,LSTM 门控能更敏感地感知细微波动。

5.2 现象:训练集均方根误差很低,测试集误差高出三倍以上

原因:火灾时序数据在原始形式下存在连续时间段的相关性,如果按时间顺序前 70% 做训练、后 30% 做测试,训练集和测试集的数据分布存在明显的分布偏移——后一段数据可能集中了更多高温样本。论文里提到实验数据做了乱序重排的预处理,目的就是切断这种时间相关性。

解决:无论用哪种划分方式,先做随机打乱再切分。更稳健的做法是采用分层抽样,保证训练集和测试集中三种火型的样本比例大致相同。复现论文实验时,我会额外记录乱序前和乱序后训练同样迭代次数的测试误差,两者差很多就说明数据分布本身就存在时间漂移,这个信息对部署很有价值——部署环境的数据分布可能同样在漂移,模型需要定期用新数据做增量更新。

5.3 现象:预测结果经常出现「阴燃概率 0.9,有火概率 0.9」的矛盾输出

原因:三个输出节点是独立的回归头,优化目标互不约束,模型完全可能对同一个输入同时给出高置信度的两个火型概率。这个问题在采样点处于火型过渡阶段时特别常见,真实信号本身就模糊,模型只是如实反映这种模糊性。

解决:决策阶段不要对三个概率值分别设阈值做判断,而是把三路概率作为模糊逻辑控制系统的输入。论文里的做法是建立模糊推理规则表,比如当阴燃概率高于 0.8 且有火概率低于 0.3 时,输出「预警」状态;两者都高于 0.7 时,输出「强预警」。模糊规则的参数可以通过历史误报数据的分布来标定,本质上是给模型输出加了一层业务规则的过滤网。

5.4 现象:LSTM 网络用 softmax 做输出层,结果分类一塌糊涂

原因:softmax 的输出总和为 1,把这个约束强加给回归目标后,模型被迫在三种火型之间做互斥选择。但阴燃火本身是有火的前驱阶段,真实标签里存在「既是阴燃又是向有火过渡」的模糊样本,互斥约束和模糊标签相冲突,模型学到的边界就会扭曲。

解决:严格按论文设计,输出层使用线性激活或恒等映射,损失函数用均方根误差做回归优化。三个概率值允许同时高或同时低,把「怎么解释」的问题完整留给决策层。这种设计在部署阶段还提供了一个额外好处——概率的绝对值包含了模型置信度信息,系统健康监控可以用它做输入分布漂移检测。

5.5 现象:实际环境测试时误报率比标准数据集测试高很多

原因:标准试验火数据集是理想条件下采集的,传感器没有安装误差,环境干扰也很小。实际部署现场可能有空调气流扰动温度场、灰尘堆积影响烟雾传感器响应、电焊作业产生大量 CO 但并没有火情。数据分布从源头就和训练集对不上。

解决:部署前采集目标环境下的「无火基线数据」,做一次数据增强把基线波动加入训练集对模型做微调。如果资源允许,在真实环境中安装一组测试传感器,持续采集两周数据,用规则引擎先标出「确定无火」的时段,把这段数据的特征分布混入训练集重新训练。火灾预测模型不是训练一次就完事的,它需要和部署环境磨合,我的经验是首月每周做一次增量训练,之后每月一次,让模型逐步适应环境特征的变化。

6. 模型评估与验证:表 1 的指标对比说明了什么,怎么复现相同结果

论文的表 1 是整篇内容里最有说服力的地方,它把 BP、RBF、RBF-BP 三种网络放在同一个实验环境下对比,评价指标包含有火概率、无火概率、阴燃概率三个方向的均方根误差以及测试时长。原始数据是 400 组训练、80 组测试,每路信号的预测结果随机抽取 10 个样本点计算平均均方根误差,同时记录网络推理总耗时。三种网络的测试时间都在 3.2 到 3.4 秒的量级,差别不大,真正的差异在精度维度——BP 的均方根误差在 0.032 到 0.037 之间,RBF 在 0.035 到 0.039 之间,而 RBF-BP 混合网络全部压到了 0.020 到 0.025 之间。

复现这个对比实验的完整流程我整理成了下面的验证清单:

步骤操作关键参数
1加载标准试验火数据,随机打乱训练集 400 组,测试集 80 组
2三路信号分别做 Z-score 归一化均值/标准差从训练集统计
3搭建两层 LSTM 模型,训练时间特征50/100 节点,sigmoid,400 epoch
4LSTM 输出分别送入 BP、RBF、RBF-BP 三个对比网络统一用均方根误差做损失
5每路输出随机抽 10 个样本点计算平均 RMSE对比三种网络的精度和耗时

单独训练一个混合网络做一次完整实验在普通单卡 GPU 上只需要几分钟,瓶颈不在算力,而在数据准备。标准试验火数据需要从论文引用的标准来源获取,公开版本一般会附带数据格式说明。我通常在数据处理阶段就把三路信号的时间戳对齐好,传感器采样频率不一致时做线性插值重采样到统一频率,这个步骤虽然不是论文原文直接提到的,但实际复现时几乎必踩,频率不一致会导致训练时张量形状不匹配。

从那以后我每次做火灾预测模型评估,都强制走一遍「打乱数据 → 独立归一化 → 分层抽样切分 → 三种网络对比」的完整流程。精度对比不是只跑一次就能下的结论,至少要换三组随机种子重复实验,观察均方根误差的分布而不是单次数值。这是我在多次复现学术方法后沉淀下来的习惯,也希望帮你在自己的数据上少走几条弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询