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

