Keras AttributeError: 'Sequential' object has no attribute 'predict_classes'
Question:
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
Answers:
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:
tensorflowpythonkerasenginesequential.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).
I used following code for predictions
y_pred = model.predict(X_test)
y_pred = np.round(y_pred).astype(int)
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
We can replace the problematic code line with the following:
y_predict = np.argmax(model.predict(x_test), axis=-1)
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)
In Tensorflow 2.7 predicted classes can be obtained with the following code:
predicted = np.argmax(model.predict(token_list),axis=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
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.
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")`
I use this and worked:
y_pred_prob = model.predict(X_test)
y_pred = np.round(y_pred_prob)
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
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:
tensorflowpythonkerasenginesequential.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 asoftmax
last-layer activation).*(model.predict(x) > 0.5).astype("int32")
, if your model does binary classification (e.g. if it uses asigmoid
last-layer activation).
I used following code for predictions
y_pred = model.predict(X_test)
y_pred = np.round(y_pred).astype(int)
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
We can replace the problematic code line with the following:
y_predict = np.argmax(model.predict(x_test), axis=-1)
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)
In Tensorflow 2.7 predicted classes can be obtained with the following code:
predicted = np.argmax(model.predict(token_list),axis=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
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.
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")`
I use this and worked:
y_pred_prob = model.predict(X_test)
y_pred = np.round(y_pred_prob)