Моя модель CNN предсказывает только первый класс, независимо от того, какое изображение я положил - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в машинном обучении и следовал шаблону на одном из курсов ML, чтобы обучить изображениям кошек и собак их классифицировать.

Если я загружу изображение, которое будет предсказано в моей модели, неважночто, предсказание становится первым классом, который я определил в конце списка.

Я делаю это для классификации других типов изображений, однако я получаю ту же ошибку в этом наборе данных, поэтому я подумалиспользования классического набора данных о кошках и собаках.

Я хочу предсказать, что если изображение текста, которое я даю обученной модели, имеет причудливый текст или стандартный текстовый шрифт.

Вот мойкод.

#create classifier 
classifier = Sequential()

#adding convolution layer
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2), strides = (2,2)))
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2), strides = (2,2)))
classifier.add(Flatten())
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))


# In[54]:

#compiling
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# In[55]:
#making Image size same
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory(
        'D:/Third Year/kaggle/cats/New Data/Convolutional_Neural_Networks/dataset/training_set',
        target_size=(64, 64),
        batch_size=32,
        class_mode='binary')

test_set = test_datagen.flow_from_directory(
        'D:/Third Year/kaggle/cats/New Data/Convolutional_Neural_Networks/dataset/test_set',
        target_size=(64, 64),
        batch_size=32,
        class_mode='binary')
print('TRAINING:',training_set)
print('TEST: ',test_set)


# In[56]:

#checking if already a weight file exists. if it does loads it into the model
if os.path.isfile("modelCNN_CD.h5") :
        classifier.load_weights("modelCNN_CD.h5")

#checkpoint saves the model.
filepath="modelCNN_CD.h5"       
checkpoint1 = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')


classifier.summary()
classifier.fit_generator(
        training_set,
        steps_per_epoch=8000,
        epochs=25,
        validation_data=test_set,
        validation_steps=2000,callbacks=[checkpoint1,])


# In[67]:
# load the model
#model = VGG16()
# load an image from file
image = load_img('D:/Third Year/kaggle/cats/New Data/Convolutional_Neural_Networks/dog.4029.jpg', target_size=(64, 64))
# convert the image pixels to a numpy array
image = img_to_array(image)
# reshape data for the model
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))

yhat = classifier.predict(image)
print(yhat)

import numpy as np
print(platetype[np.argmax(yhat)])

# In[57]:

platetype = ['Cat','Dog']

# In[9]:

from keras.models import load_model
classifier = load_model('modelCNN_LP.h5')

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Ваш предиктор всегда возвращает 0 в качестве класса?

Причина, по которой я спрашиваю, заключается в том, что у меня возникла та же проблема, и проблема связана с "platetype[np.argmax(yhat)]", а также с тем, что вы используете двоичную классификацию режима класса,

argmax будет возвращать позицию индекса результата, но так как вы используете двоичные классы и в вашем последнем слое у вас есть 1 плотность.Он будет возвращать только одно значение, поэтому он всегда будет возвращать первый класс (0 в качестве позиции индекса).Поскольку сеть настроена только на один класс.

Существует 2 решения, и это зависит от того, что вы предпочитаете:

  1. Необходимо изменить class_mode на «категорический» для генератора поездов и теста, изменить конечный плотный слой с 1 на2, так что это будет возвращать баллы / вероятности для обоих классов.Поэтому, когда вы используете argmax, он вернет индексную позицию верхней оценки, указывающую, какой класс он предсказал.
  2. Другой способ - придерживаться того, что у вас есть, но вам придется изменить способ определениякласс.Вы бы использовали счет, так что yhat будет список.Вам нужно будет получить доступ к баллу и на основе этого определить, какой класс предсказал модель.Может быть, кто-то может уточнить это, поскольку я не использовал этот метод, и я не уверен.

Надеюсь, это поможет !.У меня была та же проблема, что и у вас, и это исправило ее для меня (я выбрал вариант 1).

Дайте мне знать, сработало ли это для вас.

0 голосов
/ 24 октября 2018

Кажется, что причина, по которой ваша модель не может сделать точный прогноз вашего нового изображения, заключается в том, что вы забыли изменить его масштаб.

Вы использовали ImageDataGenerator () во время тренировки с коэффициентом масштабирования 1./255.

Просто добавьте:

...
image = load_img('D:/Third Year/kaggle/cats/New Data/Convolutional_Neural_Networks/dog.4029.jpg', target_size=(64, 64))

image = img_to_array(image)

image = image/255.  # Add this line 

image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))

yhat = classifier.predict(image)
...

, и оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...