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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:25:18