Keras predicting different output for same input image

729 Views Asked by At

am working on a classification problem for binary classes, I have finished the training and testing the model in single images now using the below code

import warnings
import time
from urllib.request import urlopen

import os
import urllib.request

start_time = time.time()
with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=FutureWarning)

    import numpy as np
    from keras.preprocessing.image import img_to_array, load_img
    from keras.models import Sequential
    from keras.layers import Dropout, Flatten, Dense, GlobalAveragePooling2D
    from keras.applications.vgg16 import VGG16
    import tensorflow as tf

import logging

logging.getLogger('tensorflow').disabled = True

img_size = 224


class PersonPrediction:
    def __init__(self):

        self.class_dictionary = np.load(

            'class_indices_vgg.npy',
            allow_pickle=True).item()

        self.top_model_weights_path = 'v2/weights/bottleneck_fc_model_2020-10-10-05.h5'

        self.num_classes = len(self.class_dictionary)

        self.model = self.create_model(self.num_classes)
        self.graph = tf.compat.v1.get_default_graph()

    def create_model(self, num_of_cls):
        model = Sequential()
        vgg_model = VGG16(include_top=False, weights='imagenet', input_shape=(img_size, img_size, 3))
        for layer in vgg_model.layers[:-4]:
            layer.trainable = False
        model.add(vgg_model)
        model.add(GlobalAveragePooling2D())
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.5))
        model.add(Dense(1, activation='sigmoid'))
        return model
    def predict(self, path=None, file_name=None):
        if path:
            image_path = path
            path = self.url_to_image(image_path)
        else:
            path = os.path.join('imgs', file_name)

            print("[INFO] loading and preprocessing image...")

        image = load_img(path, target_size=(224, 224))
        image = img_to_array(image)

        # important! otherwise the predictions will be '0'
        image = image / 255

        image = np.expand_dims(image, axis=0)

        label_idx = self.model.predict_classes(image)[0][0]
        probability = self.model.predict(image)[0]

        inv_map = {v: k for k, v in self.class_dictionary.items()}

        label = inv_map[label_idx]

        return label, probability[0]
path = 'temp.jpg'
tax_model = PersonPrediction()
label, proba = tax_model.predict(
    file_name='frame303.jpg')
print(label, proba)

Problem is I keep getting chaning predictions of both label and accuracy every time I rerun the code, am not sure what is causing that

1

There are 1 best solutions below

0
On

There are a number of sources that create randomness in the results when training a model. First the weights are randomly initialized so your model is starting from a different point in N space (N is the number of trainable parameters). Second layers like dropout have randomness in terms of which nodes will be nodes will be selected. Some GPU processes particularly with multi-processing can also have some degree of randomness. I have seen a number of posts on getting repeatable results in tensorflow but I have not found one that seems to really work. In general though the results should be reasonably close if your model is working correctly and you run enough epochs. Now once the model is trained and you use it for predictions as long as you use the same trained model you should get identical prediction results.