Quoding
Quoding

Reputation: 305

Targets must be 1-dimensional Top_k_categorical_accuracy in Tensorflow

I've just finished training an Inception V3 CNN and I'm trying to measure accuracy on the training dataset, specifically, top-k accuracy. I invoke the function called top_k_categorical_accuracy from tensorflow.keras.metrics ordering my parameters properly (y_true, y_pred, k) but I receive an error saying my targets (y_true) should be 1-dimensional. However, when I print the shape of y_true (which are the targets, if I understand correctly) I get (9000,), which, to me, seems 1-dimensional.

Both arrays have a dtype = "float32" since I read in a thread that this caused problem, but this does not solve my problem.

import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator
from keras.applications import InceptionV3
from keras.applications.inception_v3 import preprocess_input

test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)

test_generator = test_datagen.flow_from_directory(
    "data/test",
    target_size=(299, 299),
    batch_size=16,
    class_mode="categorical",
    shuffle=True,
    seed=42,
)

STEP_SIZE_TEST = test_generator.n // test_generator.batch_size


model = keras.models.load_model("inceptionv3.hdf5")

results = model.evaluate_generator(test_generator, STEP_SIZE_TEST, workers=8)

y_pred = model.predict_generator(test_generator)
print(y_pred.shape) # Prints (9000, 6)
y_true = test_generator.classes
y_true = y_true.astype("float32") 
print(y_true.shape) #Prints (9000,)

top_k = tf.keras.metrics.top_k_categorical_accuracy(y_true, y_pred, k=2)

The exact error I get is this : tensorflow.python.framework.errors_impl.InvalidArgumentError: targets must be 1-dimensional [Op:InTopKV2]

If I resize y_pred to a 1D array, I get the following error : tensorflow.python.framework.errors_impl.InvalidArgumentError: predictions must be 2-dimensional [Op:InTopKV2]

Upvotes: 2

Views: 475

Answers (2)

Quoding
Quoding

Reputation: 305

As Yoskutik suggested in the comments of his answer : As written in documentation, y_true may be a matrix. Try to convert it to a categorical array:

y_true = tf.keras.utils.to_categorical(y_true)

This is what worked in this case.

Upvotes: 2

Yoskutik
Yoskutik

Reputation: 2089

Have you tried this one?

y_pred = np.argmax(y_pred, axis=1)

As I understand you have something like Dense(6, activation='softmax') at last layer. That's why y_pred is matrix. The script above can help.

Upvotes: 1

Related Questions