如何用Keras TensorFlow实现多分类预测?模型返回异常数组求解
问题解决与优化建议
核心问题原因
你看到的“奇怪数组”是因为模型最后一层Dense(units=10)设置了10个输出单元,但你的数据集只有3个类别(1、2、3),softmax层的输出单元数必须和类别数量一致,所以现在模型输出的是10个类别的概率分布,完全不符合你的分类需求。
修正后的训练代码
把最后一层的输出单元数改为3,同时建议加上metrics=['accuracy']来监控训练准确率:
import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from keras.losses import SparseCategoricalCrossentropy X = np.array( [[3, 7], [3, 6], [3, 7.2], [6, 8], [7, 7.5], [7.9, 7.5]]) Y = np.array([1, 1, 1, 2, 3, 3]) model = Sequential([ Dense(units=25, activation="relu"), Dense(units=15, activation="relu"), Dense(units=3, activation="softmax"), # 输出单元数和类别数一致 ]) model.compile(loss=SparseCategoricalCrossentropy(), metrics=['accuracy']) model.fit(X, Y, epochs=100)
正确的预测代码
现在模型会输出3个概率值,分别对应类别1、2、3的概率。用np.argmax()取概率最大的索引,再加1就是对应的类别(因为索引从0开始,你的类别从1开始):
Xpred = [[3,7.8]] prediction = model.predict(Xpred, verbose=0) # verbose=0关闭冗余输出 predicted_class = np.argmax(prediction) + 1 # 索引0对应类别1,所以加1 print(f"预测类别: {predicted_class}") print(f"各类别概率分布: {prediction}")
关键改进建议
- 补充训练数据:目前只有6条训练样本,模型极易过拟合(记住了训练数据的细节,但泛化能力差)。尽量收集更多真实样本,或者对现有数据做微小扰动生成新样本(比如给X的数值加减0.1以内的随机数)。
- 标准化输入特征:虽然你的特征数值范围接近,但对输入做标准化(比如用
sklearn.preprocessing.StandardScaler)能让模型更快收敛,提升稳定性。 - 简化模型结构:当前网络的隐藏层单元数对小数据集来说偏多,可尝试减少到
Dense(10, activation='relu'),或者添加Dropout(0.2)层防止过拟合。 - 监控训练状态:训练时加上
validation_split=0.2,划分部分数据做验证,观察验证集准确率变化,避免过拟合。
入门学习资料
- TensorFlow官方多分类实战教程:跟着官方的分类案例一步步操作,理解softmax、稀疏交叉熵的适用场景。
- 《Python机器学习》(Sebastian Raschka著):从基础概念讲起,覆盖分类模型的核心原理和实现方法。
- Keras官方文档:学习模型构建、损失函数选择、训练调参的基础规范,解决日常开发中的常见问题。
内容的提问来源于stack exchange,提问作者Kawith
相关产品推荐
相关产品推荐

