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

如何提升TF Keras多分类任务的模型准确率?

提升TF Keras多分类模型准确率的建议

嘿,看了你的代码和问题,我发现几个关键问题,调整后应该能明显提升准确率,咱们一步步来:

1. 修正模型结构的核心错误

你当前的模型连续用了3个softmax激活层,这是完全不合理的!softmax是专门用于输出层的激活函数,它会把输出归一化为和为1的概率分布,适配多分类任务。但中间隐藏层用softmax会严重破坏特征传递——它会压缩特征的表达空间,让模型无法有效学习到复杂的模式。

正确的结构应该是:中间隐藏层用relu(或其他非线性激活函数),只在最后一层(对应20个标签的输出层)用softmax:

def baseline_model():
    model = Sequential()
    model.add(Dense(64, input_dim=3, activation='relu'))  # 调整神经元数,用relu
    model.add(Dense(32, activation='relu'))  # 中间层依然用relu
    model.add(Dense(20, activation='softmax'))  # 只有输出层用softmax
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

2. 对特征做标准化处理

你只把特征转成了float类型,但没有做标准化/归一化。神经网络对特征尺度非常敏感,不同尺度的特征会导致优化器收敛困难,最终影响模型性能。建议用StandardScaler把特征缩放到均值为0、方差为1的范围:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
features = scaler.fit_transform(features.astype(float))

3. 控制训练轮数,避免过拟合

你设置了epochs=5000,这绝对会导致严重的过拟合——模型会记住训练集的细节,而无法泛化到验证集。改用**早停(EarlyStopping)**回调,让模型在验证集性能不再提升时自动停止训练,同时恢复最优权重:

from tensorflow.keras.callbacks import EarlyStopping

early_stop = EarlyStopping(
    monitor='val_loss',  # 监测验证集损失
    patience=20,  # 20轮没提升就停止
    restore_best_weights=True,  # 恢复到性能最好的权重
    verbose=1
)

# 训练时替换你的ch回调
history = model.fit(
    data, dummy_y, 
    epochs=5000,  # 设大一点没关系,早停会自动终止
    batch_size=50, 
    validation_split=0.3, 
    shuffle=True, 
    callbacks=[early_stop]
).history

4. 增加正则化,防止过拟合

如果调整后还是过拟合,可以在隐藏层后加入Dropout层随机丢弃部分神经元,或者给Dense层加L2正则化:

from tensorflow.keras.layers import Dropout
from tensorflow.keras.regularizers import l2

def improved_model():
    model = Sequential()
    model.add(Dense(64, input_dim=3, activation='relu', kernel_regularizer=l2(0.01)))
    model.add(Dropout(0.2))  # 丢弃20%的神经元
    model.add(Dense(32, activation='relu', kernel_regularizer=l2(0.01)))
    model.add(Dropout(0.2))
    model.add(Dense(20, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

5. 检查数据集的标签分布

如果你的20个标签是不平衡的(比如某些标签样本量极少),单纯的准确率指标会误导你,模型会倾向于预测样本多的类别。这时候可以:

  • 用class_weight参数给少数类更高的损失权重:
    from sklearn.utils.class_weight import compute_class_weight
    
    class_weights = compute_class_weight(
        class_weight='balanced',
        classes=np.unique(encoded_Y),
        y=encoded_Y
    )
    class_weight_dict = dict(zip(np.unique(encoded_Y), class_weights))
    
    # 训练时加入class_weight参数
    history = model.fit(..., class_weight=class_weight_dict)
    
  • 改用F1分数、混淆矩阵等更合适的评估指标。

6. 调整模型容量和优化器

  • 你的输入特征只有3维,如果任务复杂度较高,可以尝试增加隐藏层的神经元数量(比如从64调到128),或者增加一层隐藏层。
  • 可以尝试调整Adam优化器的学习率,比如设置optimizer=Adam(learning_rate=0.0001),或者用ReduceLROnPlateau回调在训练停滞时降低学习率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:37:51