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

加载KerasClassifier后运行predict提示无classes_属性如何解决

问题原因分析
  • 第一个报错'KerasClassifier' object has no attribute 'classes_':KerasClassifier是适配scikit-learn接口的包装类,classes_、n_classes_这类属性仅在调用fit()方法完成训练后才会自动生成。你仅手动给实例赋值了内部model属性,跳过了训练流程,缺失的属性导致predict调用失败。
  • 第二个报错name 'model2' is not defined:变量必须先声明定义才能访问其属性,你删除了model2的实例化代码,直接对不存在的变量赋值属性自然触发未定义错误。
可行解决方案

方案1(推荐):直接使用加载的原生Keras模型预测

你已经保存了训练完成的原生Keras模型,不需要再套KerasClassifier包装即可直接调用预测,代码如下:

from tensorflow.keras.models import load_model
import numpy as np

# 直接加载训练好的模型
model2 = load_model('model')
# 预测得到概率结果
pred_proba = model2.predict(testX)
# 如需类别标签,取概率最高的类别即可
preds = np.argmax(pred_proba, axis=1)

该方案代码最简,没有额外冗余逻辑,性能也最优。

方案2:保留KerasClassifier接口调用

如果你需要兼容scikit-learn的API接口,必须使用KerasClassifier实例调用,可以手动补全缺失的属性:

from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from tensorflow.keras.models import load_model
import numpy as np

def baseline_model():
    model = Sequential()
    model.add(Dense(8, input_dim=80, activation='relu'))
    model.add(Dense(4, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.01), metrics=['accuracy'])
    return model

# 实例化KerasClassifier
model2 = KerasClassifier(build_fn=baseline_model, epochs=100)
# 加载训练好的模型
model2.model = load_model('model')
# 手动补全classes_属性,这里的数组对应你训练时的所有类别标签
model2.classes_ = np.array([0,1,2,3])

# 现在可以正常调用predict
preds = model2.predict(testX)

如果不确定classes的取值,也可以用少量带标签的样本调用一次partial_fit自动生成属性:

# 假设trainY是你训练时的标签集合,先拿到所有唯一类别
all_classes = np.unique(trainY)
# 用1条样本触发属性初始化
model2.partial_fit(testX[:1], testY[:1], classes=all_classes)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:06:03