Keras 属性错误: 'Sequential' 对象没有属性 'predict_classes'。

70

我正在尝试按照这个指南找到模型性能度量(F1值、准确率、召回率)https://machinelearningmastery.com/how-to-calculate-precision-recall-f1-and-more-for-deep-learning-models/

这段代码在几个月前运行正常,但现在返回各种错误,非常令人困惑,因为我没有更改过代码的任何字符。也许是包更新改变了一些东西?

我使用model.fit拟合序列模型,然后使用model.evaluate找到测试准确率。现在我正在尝试使用model.predict_classes进行类别预测(模型是多类分类器)。下面是代码:

model = Sequential()
model.add(Dense(24, input_dim=13, activation='relu'))
model.add(Dense(18, activation='relu'))
model.add(Dense(6, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

-

history = model.fit(X_train, y_train, batch_size = 256, epochs = 10, verbose = 2, validation_split = 0.2)

-

score, acc = model.evaluate(X_test, y_test,verbose=2, batch_size= 256)
print('test accuracy:', acc)

-

yhat_classes = model.predict_classes(X_test)
 

最后一行代码报错:“AttributeError: 'Sequential' object has no attribute 'predict_classes'”。

这段代码不久之前还能正常工作,现在有些困难,感谢任何帮助。


1
你是在 Colab 上运行这个程序吗? - Dr. Snoopy
10个回答

111

这个函数在 TensorFlow 2.6 版本中被移除了。根据 rstudio 中的 keras 参考文献,需要更新。

predict_x=model.predict(X_test) 
classes_x=np.argmax(predict_x,axis=1)

或者使用TensorFlow 2.5.x版本。

如果您正在使用TensorFlow 2.5版本,您将收到以下警告:

tensorflow\python\keras\engine\sequential.py:455: UserWarning: model.predict_classes()已弃用,并将在2021年01月01日后删除。请改用以下方法:* np.argmax(model.predict(x), axis=-1),如果您的模型进行多类分类(例如,如果它使用softmax作为最后一层激活)。* (model.predict(x) > 0.5).astype("int32"),如果您的模型进行二元分类(例如,如果它使用sigmoid作为最后一层激活)。


链接现在已经失效。 - etotheipi
这个损坏的链接已经被修复了。 - Xueke

41

我遇到了同样的错误,我使用以下代码并成功解决:

替换为:

predictions = model.predict_classes(x_test)

用这个:

predictions = (model.predict(x_test) > 0.5).astype("int32")

Python软件包的类型:Tensorflow 2.6.0


谢谢,用你建议的代码替换后可以了! - Ayan
谢谢。代码对我有用。我正在使用Keras。 - sizo_abe

12
在最新版本的TensorFlow中,predict_classes函数已被弃用(在以前的版本中已有相应警告)。新的语法如下:
predictions = np.argmax(model.predict(x_test),axis=1)

在输入代码时,请使用代码块。 - Kofi
有文档链接吗? - Freddy Mcloughlan
比之前的答案表现更好。 - Wael Dimassi

10

我们可以用以下代码替换有问题的代码行:

y_predict = np.argmax(model.predict(x_test), axis=-1)

9
我会尽力满足你的翻译需求。以下是您需要翻译的内容:

我用下面的代码进行预测:

y_pred = model.predict(X_test)
y_pred = np.round(y_pred).astype(int)

这对我没有用。之前的答案有效。 - Karl Djotchuang Tamo

6
在Tensorflow 2.7中,可以使用以下代码获取预测类别:
    predicted = np.argmax(model.predict(token_list),axis=1)

2
对于下面这段代码,它适用于整个数据集:
preds = model.predict_classes(test_sequences)

这段代码可以用于新版本。

y_predict = np.argmax(model.predict(test_sequences), axis=1)

在这里,“test_sequence”是您需要预测的数据帧,而axis是选择列或行的选项。

1
请使用这个版本,因为在最新的tensorflow版本中已经删除了predict_classes。
predictions = (model.predict(X_test) > 0.5)*1 

由于这是一个二元问题(0或1),输出类别是由概率是否大于0.5来确定的。因此,上面的代码如下:


1
如果您正在使用多类分类,则使用np.argmax(model.predict(x), axis=-1)
例如:
predictions = np.argmax(model.predict(x_test),axis=1)

如果你手头上有一个二分类问题,可以使用 (model.predict(x) > 0.5).astype("int32")
例如:
`predictions=(model.predict(X_test) > 0.5).astype("int32")`

1

我使用这个方法,有效果:

y_pred_prob = model.predict(X_test)
y_pred = np.round(y_pred_prob)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接