1
$\begingroup$

I completed training the model with an accuracy of 1.000 and a validation accuracy of 0.9565. Unfortunately whenever i input a image into my model i get the same output regardless. Am i doing something wrong when predicting or during my training. W and A are my class labels.

My folder structure for the image generators are as follows:

images/

a/ a001.jpg.png.. w/ w002.jpg.png..

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

test_datagen = ImageDataGenerator(rescale=1./255)

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense

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

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

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

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
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'])

batch_size = 64

# this is a generator that will read pictures found in
# subfolers of 'data/train', and indefinitely generate
# batches of augmented image data
train_generator = train_datagen.flow_from_directory(
    'C:\\Users\\Zahid\\Desktop\\Dataset\\train',  # this is the target directory
    target_size=(150, 150),  # all images will be resized to 150x150
    batch_size=batch_size,
    color_mode='rgb',
    class_mode='binary')  # since we use binary_crossentropy loss, we need binary labels

# this is a similar generator, for validation data
validation_generator = test_datagen.flow_from_directory(
    'C:\\Users\\Zahid\\Desktop\\Dataset\\val',
    target_size=(150, 150),
    batch_size=batch_size,
    color_mode='rgb',
    class_mode='binary')

model.fit_generator(
    train_generator,
    steps_per_epoch=2000 // batch_size,
    epochs=50,
    validation_data=validation_generator,
    validation_steps=800 // batch_size)
model.save_weights('first_try.h5')

img = cv2.imread("C:\\Users\\Zahid\\Desktop\\Data\\TrainingData\\images\\a\\img_0201.jpg.png")
resized_image = cv2.resize(image, (150, 150))
x = img_to_array(resized_image)
x = x.reshape((1,) + x.shape)
x = x/255
print(x.shape)
scores_train = model.predict(x)
print(scores_train)
$\endgroup$
2
  • $\begingroup$ what is number 1 in your last dense layer? Do you have only one class? and why you use a sigmoid function in the output layer? try using softmax function, it is better. $\endgroup$ – Hunar Apr 6 '19 at 13:40
  • 1
    $\begingroup$ @honas.cs I Have two classes as mentioned in the question , and i followed a keras example to train this model. As shown in my folder structure i have seperated the classes into two seperate folders and trained them. $\endgroup$ – Zahid Ahmed Apr 6 '19 at 13:43
0
$\begingroup$

As you are using sigmoid as activation function in last layer. It will output generate output based on if probability above 50% then it belongs to "W" class and if it is less than 50% belongs to "A" class. If you can print output probability of different images & share it then it will little helpful for us for understand problem

$\endgroup$
1
  • $\begingroup$ The output probability remains the same regardless of the image at 3.2287784e-15. $\endgroup$ – Zahid Ahmed Apr 6 '19 at 16:28
0
$\begingroup$

The issue was fixed by changing the Dense Layer to 2 hence specifying two classes, and also switching the Sigmoid activation function with a Softmax function.

$\endgroup$
0
$\begingroup$

When you divide by 255 in the prediction make sure that the datatype is float and not int or unsigned int. Make sure to implicitly convert the image x to float and divide by 255.0 before prediction. In other words make sure that you array is not all 0. You can still use Sigmoid for binary classifica with 1 dense layer. It should work

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.