如何修复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
相关产品推荐
相关产品推荐

