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

Keras多输出二分类模型精度停滞问题求助及网络优化建议

问题描述

我的目标是设计并训练一个模型,检测线轮廓中的导数不连续点。模型输入为1D向量,包含多个相邻几何形状(如线-圆、圆-圆、线-线等),形状衔接点数值几乎相同;输入向量代表实际测量值,非轮廓部分设为0,向量长度为length且已归一化,示例输入格式为[0,0,0,...,profile1,profile2,...,0,0,0]。

我将任务视为多输出二分类问题,模型输出维度为length的1D向量,目标点标记为1,其余为0,期望网络定位不同轮廓的起止点。但训练中无论调整批量大小和学习率,精度始终停滞在0.5左右,预测结果也未能在目标点处形成峰值;相关训练曲线与示例如下:

  • 图1:损失随epoch变化曲线
  • 图2:精度随epoch变化曲线
  • 图3:测量轮廓中的"x"为待预测点,预测结果未在该点形成峰值

当前使用的网络结构与训练代码如下:

# Define the neural network model
model = keras.Sequential([
        layers.InputLayer(input_shape=(length,)),
        layers.Dense(512, activation='relu'),
        layers.Dense(2048, activation='relu'),
        layers.Dense(length, activation='sigmoid')                                             
        # Output layer with 'length' units for probability estimate
])

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Compile the model

# Train the model
history = model.fit(x_train, y_train, epochs=num_epochs, batch_size=batch)

请问有什么解决建议?是否有更合适的网络结构设计?


解决建议与优化方案

一、数据与任务层面优化

  1. 处理类别不平衡:目标点(标记为1)数量远少于背景(标记为0)是精度停滞的核心原因之一

    • 替换损失函数为Focal Loss,降低易分类的背景样本权重,强制模型聚焦少数目标点;
    • 采用加权交叉熵,给目标点设置更高权重(权重值可按总样本数/(2*正样本数)计算);
    • 对训练数据做过采样(复制含目标点的样本)或欠采样(减少纯背景样本数量)。
  2. 增强输入特征:原始轮廓值难以直接反映导数突变,需补充局部变化特征

    • 提前计算输入向量的一阶/二阶导数(如差分法dx = x[1:] - x[:-1],补0对齐长度),将原始值与导数拼接作为模型输入;
    • 提取滑动窗口特征,每个位置的特征包含自身及前后n个点的局部信息,帮助模型感知局部突变。

二、网络结构优化

当前全连接层完全忽略1D序列的空间相关性,无法有效捕捉局部突变,推荐以下结构:

1. 1D卷积神经网络(CNN)

1D CNN擅长捕捉序列局部特征,适配轮廓突变检测需求:

model = keras.Sequential([
    layers.InputLayer(input_shape=(length, 1)),  # 增加通道维度
    # 局部特征提取
    layers.Conv1D(64, kernel_size=5, activation='relu', padding='same'),
    layers.MaxPooling1D(pool_size=2),
    layers.Conv1D(128, kernel_size=3, activation='relu', padding='same'),
    layers.MaxPooling1D(pool_size=2),
    # 上采样恢复输出长度
    layers.UpSampling1D(size=2),
    layers.Conv1D(64, kernel_size=3, activation='relu', padding='same'),
    layers.UpSampling1D(size=2),
    # 输出层
    layers.Conv1D(1, kernel_size=1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  • 用padding='same'保证特征图长度一致,配合池化+上采样还原原始序列长度;
  • 小卷积核(3/5)适合捕捉局部突变,避免大核带来的信息冗余。

2. 1D U-Net结构

针对序列点级分割任务,1D U-Net结合局部细节与全局信息,精准定位突变点:

def build_1d_unet(input_length):
    inputs = layers.Input(shape=(input_length, 1))
    
    # 下采样路径
    c1 = layers.Conv1D(64, 3, activation='relu', padding='same')(inputs)
    c1 = layers.Conv1D(64, 3, activation='relu', padding='same')(c1)
    p1 = layers.MaxPooling1D(2)(c1)
    
    c2 = layers.Conv1D(128, 3, activation='relu', padding='same')(p1)
    c2 = layers.Conv1D(128, 3, activation='relu', padding='same')(c2)
    p2 = layers.MaxPooling1D(2)(c2)
    
    # 瓶颈层
    c3 = layers.Conv1D(256, 3, activation='relu', padding='same')(p2)
    c3 = layers.Conv1D(256, 3, activation='relu', padding='same')(c3)
    
    # 上采样路径
    u4 = layers.UpSampling1D(2)(c3)
    u4 = layers.concatenate([u4, c2])
    c4 = layers.Conv1D(128, 3, activation='relu', padding='same')(u4)
    c4 = layers.Conv1D(128, 3, activation='relu', padding='same')(c4)
    
    u5 = layers.UpSampling1D(2)(c4)
    u5 = layers.concatenate([u5, c1])
    c5 = layers.Conv1D(64, 3, activation='relu', padding='same')(u5)
    c5 = layers.Conv1D(64, 3, activation='relu', padding='same')(c5)
    
    outputs = layers.Conv1D(1, 1, activation='sigmoid')(c5)
    
    return keras.Model(inputs=inputs, outputs=outputs)

model = build_1d_unet(length)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  • 跳跃连接保留下采样过程中的局部细节,提升点级预测精度;
  • 适配需要高精度定位的序列分割任务。

3. 循环神经网络(LSTM)

LSTM捕捉序列长期依赖,适合处理连续轮廓数据:

model = keras.Sequential([
    layers.InputLayer(input_shape=(length, 1)),
    layers.LSTM(128, return_sequences=True),
    layers.LSTM(64, return_sequences=True),
    layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  • return_sequences=True保证每层输出与输入序列长度一致,实现点级预测。

三、训练策略优化

  1. 调整评估指标:类别不平衡场景下精度参考价值低,改用F1分数、召回率或交并比(IoU)作为核心指标;
  2. 学习率调度:使用ReduceLROnPlateau回调函数,验证损失停滞时自动降低学习率,避免陷入局部最优:
from keras.callbacks import ReduceLROnPlateau
lr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-6)
history = model.fit(x_train, y_train, epochs=num_epochs, batch_size=batch, 
                    validation_split=0.1, callbacks=[lr_scheduler])
  1. 加入验证集:训练时划分验证集,实时监控泛化能力,避免过拟合或欠拟合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:50:13