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

Keras Conv1D二进制信号分类模型不收敛问题优化请求

问题描述

我正在用Keras做二进制(0/1)信号分类任务,输入是维度[,32]的向量,输出是[,16]的向量,数据集有40万+样本。构建的Conv1D模型训练时完全未学习,损失持续飙升,准确率极低,关键训练输出如下:

Epoch 1/10
2529/2529 ━━━━━━━━━━━━━━━━━━━━ 19s 7ms/step - accuracy: 0.0527 - loss: 18883880.0000 - val_accuracy: 0.0116 - val_loss: 433219648.0000
...
Epoch 10/10
2529/2529 ━━━━━━━━━━━━━━━━━━━━ 19s 8ms/step - accuracy: 0.0264 - loss: 1706346020864.0000 - val_accuracy: 3.1636e-04 - val_loss: 2313546366976.0000

核心问题与修复方案

1. 输入维度不匹配Conv1D要求

Conv1D层需要输入形状为(样本数, 时间步长, 特征数),但当前输入是二维数组(样本数, 32),缺少特征维度。需为输入增加一个维度:

# 给输入数据添加特征维度,将形状从(样本数,32)转为(样本数,32,1)
import numpy as np
XTrainData = np.expand_dims(XTrainData, axis=-1)
XValidationData = np.expand_dims(XValidationData, axis=-1)
XTestData = np.expand_dims(XTestData, axis=-1)

2. 损失函数与任务类型不匹配

任务是多标签二进制分类(16个独立的0/1标签),但误用了适用于单标签多分类的categorical_crossentropy,需替换为binary_crossentropy,同时输出层激活函数改为sigmoid(每个输出独立预测0/1概率):

# 修改输出层激活函数
model.add(Dense(n_outputs, activation='sigmoid'))

# 修改损失函数与评估指标
optimizer = tf.keras.optimizers.Adam(0.001)
model.compile(loss='binary_crossentropy',
              optimizer=optimizer,
              metrics=[tf.keras.metrics.BinaryAccuracy(name='accuracy')])

3. 数据集划分逻辑错误

原代码实际划分比例为训练64%、测试16%、验证16%,不符合预期的6:2:2,修正划分逻辑:

# 先拆分训练集(60%)和临时集(40%)
TrainData, TempData = train_test_split(AllData, train_size=0.6, random_state=42)
# 再将临时集拆分为验证集和测试集各20%
ValidationData, TestData = train_test_split(TempData, train_size=0.5, random_state=42)

4. 模型结构冗余与训练参数优化

原模型Conv1D层和Dropout过多,易导致特征丢失;学习率过小、批量大小不足影响收敛速度。简化模型并调整训练参数:

# 简化后的模型结构
model = Sequential()
model.add(Input(shape=(n_timesteps, n_features)))  # 替换input_shape参数,消除警告
model.add(Conv1D(filters=32, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(n_outputs, activation='sigmoid'))

# 加入早停回调防止过拟合
early_stopping = tf.keras.callbacks.EarlyStopping(
    monitor='val_loss',
    patience=5,
    restore_best_weights=True
)

# 训练模型
history = model.fit(XTrainData, YTrainData, 
                    epochs=50, 
                    batch_size=256,
                    validation_data=(XValidationData, YValidationData),
                    callbacks=[early_stopping])

5. 数据标准化预处理

信号数据标准化到0-1区间,可大幅加快模型收敛速度:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
XTrainData = scaler.fit_transform(XTrainData)
XValidationData = scaler.transform(XValidationData)
XTestData = scaler.transform(XTestData)

# 标准化后再添加特征维度
XTrainData = np.expand_dims(XTrainData, axis=-1)
XValidationData = np.expand_dims(XValidationData, axis=-1)
XTestData = np.expand_dims(XTestData, axis=-1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:37:07