67

Im attempting to find model performance metrics (F1 score, accuracy, recall) following this guide https://machinelearningmastery.com/how-to-calculate-precision-recall-f1-and-more-for-deep-learning-models/

This exact code was working a few months ago but now returning all sorts of errors, very confusing since i havent changed one character of this code. Maybe a package update has changed things?

I fit the sequential model with model.fit, then used model.evaluate to find test accuracy. Now i am attempting to use model.predict_classes to make class predictions (model is a multi-class classifier). Code shown below:

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)
 

last line returns error "AttributeError: 'Sequential' object has no attribute 'predict_classes'"

This exact code was working not long ago so struggling a bit, thanks for any help

Greig Fotheringham
  • 683
  • 1
  • 5
  • 5

10 Answers10

107

This function was removed in TensorFlow version 2.6. According to the keras in rstudio reference

update to

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

Or use TensorFlow 2.5.x .

If you are using TensorFlow version 2.5, you will receive the following warning:

tensorflow\python\keras\engine\sequential.py:455: UserWarning: model.predict_classes() is deprecated and will be removed after 2021-01-01. Please use instead:* np.argmax(model.predict(x), axis=-1), if your model does multi-class classification (e.g. if it uses a softmax last-layer activation).* (model.predict(x) > 0.5).astype("int32"), if your model does binary classification (e.g. if it uses a sigmoid last-layer activation).

brobers
  • 368
  • 1
  • 10
Xueke
  • 1,214
  • 1
  • 6
  • 6
40

I experienced the same error, I use this following code, and succeed

Replaced:

predictions = model.predict_classes(x_test)

With this one:

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

Type of python packages : Tensorflow 2.6.0

hadeneh
  • 111
  • 1
  • 7
12

In the newest version of Tensorflow, the predict_classes function has been deprecated (there was a warning in previous versions about this). The new syntax is as follows:

predictions = np.argmax(model.predict(x_test),axis=1)
Aesir
  • 2,033
  • 1
  • 28
  • 39
Quantum Prophet
  • 337
  • 2
  • 8
10

We can replace the problematic code line with the following:

y_predict = np.argmax(model.predict(x_test), axis=-1)
Jaden Tseng
  • 101
  • 1
  • 6
9

I used following code for predictions

y_pred = model.predict(X_test)
y_pred = np.round(y_pred).astype(int)
arun
  • 461
  • 4
  • 7
6

In Tensorflow 2.7 predicted classes can be obtained with the following code:

    predicted = np.argmax(model.predict(token_list),axis=1)
Abhinand P
  • 83
  • 1
  • 5
2

For this code below for an entire dataset,

preds = model.predict_classes(test_sequences)

This code can be used for the new versions.

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

In this, the "test_sequence" is the data frame u have to predict, and the axis is to choose either columns or rows.

1

Use this as the predict_classes are removed with the latest version of tensorflow

predictions = (model.predict(X_test) > 0.5)*1 

Since this is a binary problem (0 or 1), the output class is determined by whether the probability is bigger than 0.5. Hence the code above

1

If you are using a multi-class classification then use np.argmax(model.predict(x), axis=-1)

for example :

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

Or else if you have a Binary classification problem at hand use (model.predict(x) > 0.5).astype("int32")

for example :

`predictions=(model.predict(X_test) > 0.5).astype("int32")`
arash
  • 141
  • 1
  • 14
0

I use this and worked:

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