You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何减少含CuDNNLSTM与CNN的Keras回归模型输出异常值?

问题描述

我用CuDNNLSTM+CNN搭建了Keras回归模型,输入是传感器测量数据,输出是传感器姿态。目前模型的均值误差很低(约为1),但输出存在大量异常值——从箱线图能看到,偶尔会出现最大180的误差。训练数据没有异常值,且已经完成预处理。

我试过输入归一化、添加高斯噪声,对异常值数量都没影响;还测试了38种以上损失函数,当前用的是最优的那种。想知道有哪些方法能减少输出异常值的数量或范围?有没有专门处理这类问题的网络拓扑或层?

模型结构

Acc = Input((window_size, 3), name='acc')
Gyro = Input((window_size, 3), name='gyro')
AGconcat = concatenate([Acc, Gyro], axis=2, name='AGconcat')

fs = Input((1,), name='fs')
ACNN = Conv1D(filters=133,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'ACNN')(Acc)
ACNN = Conv1D(filters=109,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'ACNN1')(ACNN)
ACNN = MaxPooling1D(pool_size=3,
                    name = 'MaxPooling1D')(ACNN)
ACNN = Flatten(name='ACNNF')(ACNN)

GCNN = Conv1D(filters=142,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'GCNN')(Gyro)
GCNN = Conv1D(filters=116,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'GCNN1')(GCNN)
GCNN = MaxPooling1D(pool_size=3,
                    name = 'GyroMaxPool1D')(GCNN)
GCNN = Flatten(name='GCNNF')(GCNN)

AGconLSTM =Bidirectional(CuDNNGRU(128, return_sequences=True, 
                                    #return_state=True,
                                    go_backwards=True,
                                    name='BiLSTM1'))(AGconcat)
                                    
FlattenAG = Flatten(name='FlattenAG')(AGconLSTM)
AG = concatenate([ACNN, GCNN,FlattenAG])
AG = Dense(units=256,
                activation= tfa.activations.mish)(AG)
Fdense = Dense(units=256,
                activation= tfa.activations.mish,
                name= 'Fdense')(fs)
AG = Flatten(name='AGF')(AG)
x = concatenate([AG, Fdense])
x = Dense(units=256,
                    activation= tfa.activations.mish)(x)
x = Flatten(name='output')(x)
output = Dense(4, activation='linear', name='quat')(x)
可行解决方案

一、损失函数优化(聚焦鲁棒性)

你已测试大量损失函数,可重点尝试对异常值低敏感的鲁棒性损失:

  • Huber损失:误差较小时用MSE保证平滑性,误差超过阈值时切换为MAE抑制大误差影响,Keras直接调用tf.keras.losses.Huber()即可。
  • Tukey's Biweight损失:完全忽略超过阈值的极端误差,比Huber鲁棒性更强,自定义实现示例:
    def tukey_biweight_loss(y_true, y_pred, c=4.685):
        error = y_true - y_pred
        abs_error = tf.abs(error)
        mask = abs_error <= c
        squared_loss = tf.square(error)
        robust_loss = tf.square(c) * (1 - tf.square(1 - tf.square(abs_error/c))) / 2
        return tf.where(mask, squared_loss, robust_loss)
    
  • Welsch损失:误差越大,损失增长速率越慢,能有效压制极端异常值的权重。

二、网络结构调整

1. 添加正则化模块

  • Dropout层:在全连接层后加入Dropout(0.2-0.3),随机失活部分神经元,防止模型过拟合局部噪声,减少极端输出。注意不要在LSTM/GRU层后过度使用,避免破坏时序信息。
  • L2正则化:在Conv1D和Dense层中添加kernel_regularizer=tf.keras.regularizers.L2(1e-4),限制权重规模,避免模型产生极端预测。

2. 增强时序模块稳定性

  • 替换GRU为CuDNNLSTM:LSTM的门控机制对时序依赖的捕捉更稳定,可能降低极端输出概率。
  • 添加注意力层:在AGconLSTM后接入注意力模块,让模型聚焦于对姿态预测关键的时序片段,减少无关噪声干扰。自定义注意力层示例:
    class AttentionLayer(tf.keras.layers.Layer):
        def __init__(self):
            super().__init__()
            self.dense = Dense(1)
        
        def call(self, inputs):
            attention_weights = tf.nn.softmax(self.dense(inputs), axis=1)
            return tf.reduce_sum(inputs * attention_weights, axis=1)
    # 使用时替换原FlattenAG:
    # attention_output = AttentionLayer()(AGconLSTM)
    

3. 输出层约束

你的输出是四元数,可添加单位归一化层:四元数需要满足单位长度约束,用tf.keras.layers.Lambda(lambda x: tf.math.l2_normalize(x, axis=-1))接在输出Dense层之后,强制输出为单位四元数,避免数值过大导致的极端误差。

三、训练策略优化

1. 加权训练

  • 给输入波动大的样本设置更高权重,或者动态调整大误差样本的训练权重:训练时记录每个样本的误差,对超过阈值的样本在下一轮训练中提高权重,让模型重点修正极端预测。
  • 根据传感器数据的置信度(如方差)分配权重,方差大的样本权重降低,减少噪声输入的影响。

2. 监控与收敛控制

  • 用EarlyStopping监控验证集的最大误差(而非均值误差),当最大误差不再下降时停止训练,避免模型后期拟合噪声。
  • 采用ReduceLROnPlateau实现学习率衰减,当验证集性能停滞时降低学习率,让模型更稳定收敛,减少震荡导致的极端输出。

3. 混合训练

先用MSE训练到均值误差达标,再切换为鲁棒性损失函数微调,兼顾整体精度和异常值抑制。

四、后处理补充

如果模型难以完全消除异常值,可在输出后添加后处理步骤:

  • 滑动窗口平滑:对输出姿态序列用滑动窗口平均,过滤孤立极端值。
  • 阈值截断与替换:根据业务场景设置误差阈值,超过阈值的预测值用前一时刻输出或邻域均值替代。
  • 卡尔曼滤波融合:结合IMU运动学模型,用卡尔曼滤波融合模型输出与原始传感器数据,修正极端异常值。

内容的提问来源于stack exchange,提问作者Arman Asgharpoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:40:39