TransWikia.com

Binary image classifier always predicting one class

Data Science Asked by asiffarhankhan on July 23, 2021

I am trying to design a model for binary image classification, this is my first classifier and I am following an online tutorial but the model always predicts class 0

My dataset contains 3620 and 3651 images of each class respectively, I don’t suppose the problem is due to an imbalanced dataset as the model is predicting only the class with lower number of sample in the dataset.

My code

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K 

img_hieght, img_width = 150,150
train_data_dir = 'dataset/train'
#validation_data_dir = 'dataset/validation'

nb_train_samples = 3000
#nb_validation_samples = 500

epochs = 10
batch_size = 16

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_hieght)
else:
    input_shape = (img_width, img_hieght, 3)

model = Sequential()
model.add(Conv2D(32,(3,3), input_shape = input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(32,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])

train_datagen = ImageDataGenerator(
    rescale = 1. /255,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizontal_flip = True)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size = (img_width,img_hieght),
    batch_size = batch_size,
    class_mode = 'binary')

model.fit_generator(train_generator,
    steps_per_epoch = nb_train_samples//batch_size,
    epochs = epochs)

model.save('classifier.h5')

I have tried checking the model summary as well, but couldn’t detect anything notable

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 148, 148, 32)      896       
_________________________________________________________________
activation_1 (Activation)    (None, 148, 148, 32)      0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 72, 72, 32)        9248      
_________________________________________________________________
activation_2 (Activation)    (None, 72, 72, 32)        0         
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
activation_3 (Activation)    (None, 34, 34, 64)        0         
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 18496)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                1183808   
_________________________________________________________________
activation_4 (Activation)    (None, 64)                0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 65        
_________________________________________________________________
activation_5 (Activation)    (None, 1)                 0         
=================================================================
Total params: 1,212,513
Trainable params: 1,212,513
Non-trainable params: 0
_________________________________________________________________
None

I have not used validation dataset, I am using only training data and testing the model manually using:

from keras.preprocessing import image
import numpy
import tensorflow as tf

categories = ['messi','ronaldo']
test_image= image.load_img('test4.jpeg', target_size = (150, 150)) 
test_image = image.img_to_array(test_image)
test_image = numpy.expand_dims(test_image, axis = 0)
test_image = test_image.reshape(-1,150, 150,3)

model = tf.keras.models.load_model('classifier.h5')
result = model.predict([test_image])   

print(model.summary())

Please consider that I have only recently started working on ML, I am anticipating some serious silly fault in the code.

One Answer

Try predict_generator

imgen = ImageDataGenerator(rescale=1/255.)
testGene = imgen.flow_from_directory(<path to testing images>,
                                        target_size=(150, 150,),
                                        shuffle=False,
                                        class_mode="input",
                                        batch_size=batch_size,
                                        save_to_dir=None
                                        )

model = load_model("classifier.h5")
pred = model.predict_generator(testGene, steps=testGene.n/batch_size)

Testing folder should something like this

<path to testing images>/testing_folder/..test_img_1.jpg
                                        ..test_img_2.jpg
                                        ..
                                        ..

you should pass directory path up to <path to testing images>"

Answered by Rajith Thennakoon on July 23, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP