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

如何修复Keras中MLP模型的validation_split报错?

问题解决:Keras中validation_split不支持稀疏矩阵的错误

错误原因

你遇到的ValueError核心原因是:Train_X_Tfidf是scipy稀疏CSR矩阵,而Keras的validation_split参数仅支持Tensor或NumPy数组类型的输入,无法直接对稀疏矩阵执行自动划分验证集的操作。

另外你的代码还有一个潜在bug:输入层的input_shape=(32, 900)设置错误。MLP处理文本TF-IDF特征时,输入是二维张量(形状为(样本数, 特征数)),所以输入层的input_shape应该是(900,)(对应每个样本900个特征),批量维度会由Keras自动处理,不需要手动指定。

解决方案

方案1:将稀疏矩阵转换为NumPy数组

直接把TF-IDF生成的稀疏矩阵转为稠密数组,就能正常使用validation_split:

# 生成TF-IDF特征后添加转换代码
Train_X_Tfidf = Train_X_Tfidf.toarray()
Test_X_Tfidf = Test_X_Tfidf.toarray()

# 修正输入层形状
model = Sequential()
model.add(Dense(units = 100, activation = 'sigmoid', input_shape=(900,)))
model.add(Dense(units = 100, activation = 'sigmoid'))
model.add(Dense(units = 2, activation = 'sigmoid'))

注意:如果TF-IDF特征数极大(比如超过10万),转稠密数组会占用大量内存,这种情况不推荐此方法。

方案2:手动划分训练集和验证集

避免使用validation_split,手动将训练数据再划分为训练集和验证集,保持稀疏矩阵格式以节省内存:

# 从已有的训练数据中划分出验证集
from sklearn.model_selection import train_test_split
Train_X_final, Val_X, Train_Y_final, Val_Y = train_test_split(
    Train_X_Tfidf, Train_Y, test_size=0.1, random_state=8
)

# 修正输入层形状
model = Sequential()
model.add(Dense(units = 100, activation = 'sigmoid', input_shape=(900,)))
model.add(Dense(units = 100, activation = 'sigmoid'))
model.add(Dense(units = 2, activation = 'sigmoid'))

# 训练时指定验证集数据
model_prediction = model.fit(
    Train_X_final, Train_Y_final, 
    epochs=epochs, batch_size=batch_size, verbose=1, 
    validation_data=(Val_X, Val_Y), callbacks =[es]
)

这个方案更适合特征数较多的场景,不会出现内存溢出问题。

额外优化建议

  • 输出层与损失函数匹配:如果是二分类任务,用binary_crossentropy损失的话,输出层可以只用1个节点+sigmoid激活;如果保留2个节点,建议将损失函数换成categorical_crossentropy,同时用to_categorical把标签转为独热编码。
  • 隐藏层激活函数:推荐使用relu,比sigmoid更不容易出现梯度消失问题,训练效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:55:14