keras model prediction did not return probability when using load_model

I have Covid-19 X-ray dataset from Kaggle. I split and resize image in to the following dimension. X_train (675, 256, 256, 3), X_test (225, 256, 256, 3) and X_val (225, 256, 256, 3). My code to train a densenet121 is the following

import numpy as np
import os
import random
from sklearn.utils import class_weight
from keras.layers import Dense, GlobalAveragePooling2D, Dropout, Input, Activation, BatchNormalization
from keras.applications import DenseNet121
from keras.models import Model
from keras import applications as A
from tensorflow.keras.models import load_model
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
from keras.optimizers import SGD

seed_value = 1234
os.environ['PYTHONHASHSEED']=str(seed_value)
random.seed(seed_value)
np.random.seed(seed_value)

X_train = A.densenet.preprocess_input(X_train)
X_test = A.densenet.preprocess_input(X_test)
X_val = A.densenet.preprocess_input(X_val)

def get_model(hparams):
    input_tensor = Input(shape=(256, 256, 3))
    pretrain = DenseNet121(weights='imagenet', input_tensor=input_tensor, include_top=False)
    idx = 52
    
    x = pretrain.output
    x = GlobalAveragePooling2D()(x)
    x = Dense(64, use_bias=False)(x)
    x = Dropout(0.25)(x)
    x = BatchNormalization(axis=-1)(x)
    x = Activation("relu")(x)
    predictions = Dense(hparams["nclass"], activation="softmax")(x)
    
    model = Model(inputs=pretrain.input, outputs=predictions)
    
    for layer in model.layers:
        if "BatchNormalization" in layer.__class__.__name__:
            layer.trainable = True
        else:
            layer.trainable = False
    
    for i in range(len(model.layers)):
        if i > idx:
            model.layers[i].trainable = True
    
    model.compile(optimizer=SGD(lr=hparams["lr"]), loss="categorical_crossentropy", metrics=["accuracy"])
    return model

weights = class_weight.compute_class_weight("balanced", classes=np.unique(y_train_labels), y=y_train_labels)
class_weights = dict(zip(np.unique(y_train_labels), weights))    

es = EarlyStopping(monitor="val_loss",
                    mode="min",
                    patience=20,
                    verbose=1,
                    restore_best_weights=True)
        
mc = ModelCheckpoint(filepath="../models/mymodel.h5",
                      monitor="val_loss",
                      mode="min",
                      verbose=1,
                      save_best_only=True)

reduce_lr = ReduceLROnPlateau(monitor="val_loss", 
                              factor=0.9, 
                              patience=5, 
                              min_lr=0.000001, 
                              verbose=1)

history = model.fit(x=X_train,
                    y=y_train,
                    class_weight=class_weights,
                    validation_data=(X_val, y_val),
                    epochs=500,
                    batch_size=8,
                    callbacks=[es, mc, reduce_lr])

Prediction of shows probability of 3 classes (e.g. [0.1, 0.6, 0.3]) but when I load model later using this command.

classifier = load_model("mymodel.h5", compile=False)
probs = classifier.predict(X_test)

It seems that the prediction results is no longer probability but a class label (also incorrectly if we refer to the previous prediction [0.1, 0.6, 0.3] ... i got [0, 0, 1] as the output of the load model. I'm using keras version 2.3.1 and tensorflow 2.1.0. May I know what went wrong and how to fix it?



Read more here: https://stackoverflow.com/questions/65704793/keras-model-prediction-did-not-return-probability-when-using-load-model

Content Attribution

This content was originally published by Ratchainant Thammasudjarit at Recent Questions - Stack Overflow, and is syndicated here via their RSS feed. You can read the original post over there.

%d bloggers like this: