CNN - Неправильный прогноз с мультиклассовой классификацией - PullRequest
0 голосов
/ 16 ноября 2018

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

     cnn = Sequential()

    #------------------- Convolução e Pooling
    cnn.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
    cnn.add(Dropout(0.5))
    cnn.add(MaxPooling2D(pool_size = (2, 2)))

    cnn.add(Conv2D(32, (3, 3), activation = 'relu'))
    cnn.add(Dropout(0.5))
    cnn.add(MaxPooling2D(pool_size = (2, 2)))

    cnn.add(Conv2D(64, (3, 3), activation = 'relu'))
    cnn.add(MaxPooling2D(pool_size = (2, 2)))

    cnn.add(Conv2D(64, (3, 3), activation = 'relu'))
    cnn.add(Dropout(0.5))
    cnn.add(MaxPooling2D(pool_size = (2, 2)))

    #Full connection
    cnn.add(Flatten())
    cnn.add(Dense(units = 128, activation = 'relu'))
    cnn.add(Dense(units = 4, activation = 'softmax'))

    # Compiling the CNN
    cnn.compile(optimizer = OPTIMIZER, loss = 'categorical_crossentropy', metrics = ['accuracy'])

    filepath="LPT-{epoch:02d}-{loss:.4f}.h5"
    checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min')
    callbacks_list = [checkpoint]

12000 изображений поездов - 3000 тестовых изображений

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('data/train',
                                                 target_size = tgt_size,
                                                 batch_size = batch_size,
                                                 class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('data/test',
                                            target_size = tgt_size,
                                            batch_size = batch_size,
                                            class_mode = 'categorical')

cnn.fit_generator(training_set,
                  #steps_per_epoch = 12000,  
                  steps_per_epoch = nb_train_samples // batch_size,                                                   
                  epochs = EPOCHS,
                  verbose = VERBOSE,
                  validation_data = test_set,
                  validation_steps = nb_validation_samples // batch_size,
                  callbacks = callbacks_list)

Мой лучший результат тренировки:

loss: 0.6410 - acc: 0.7289 - val_loss: 0.6308 - val_acc: 0.7293

Показатели класса:

{'.ipynb_checkpoints': 0, 'cats': 1, 'dogs':2, 'person':3}

(я не могу удалить эту папку ipynb)

Прогноз:

pred1 = 'single_prediction/ct.jpg'
pred2 = 'single_prediction/ps.jpg'
pred3 = 'data/single_prediction/dg.jpg'

test_img = image.load_img(pred1, target_size = tgt_size)
test_img = image.img_to_array(test_img)
test_img = np.expand_dims(test_img, axis = 0)
pred = new_model.predict(test_img)
print(pred)

if pred[0][1] == 1:
        print('It is a cat!')
elif pred[0][2] == 1:
    print('It is a dog!')
elif pred[0][3] == 1:
    print('It is a Person!')

И вывод для изображения кошки:

[[0.000000e+00 0.000000e+00 8.265931e-34 1.000000e+00]]

Я уже пробовал: Изменить количество слоев (добавленных и удаленных), увеличить эпохи, уменьшить пакет ... Я также попытался с помощью np.argmax (). Может кто-нибудь, пожалуйста, дайте мне свет здесь?

ОБНОВЛЕНИЕ : Я удалил скрытую папку ноутбука jupyter с помощью команды shutil.rmtree () и тренировался около 40 эпох, пока не прекратил улучшаться. Наконец, я изменил прогнозное изображение и понял его правильно.

test_img = image.img_to_array(test_img)/255

Спасибо за помощь!

1 Ответ

0 голосов
/ 17 ноября 2018

Проблема с папкой контрольных точек ipynb.Это скрытая папка.Вы должны сначала удалить его.Затем измените выходной плотный слой, чтобы иметь 3 единицы (классы).Измените это

cnn.add(Dense(units = 4, activation = 'softmax')) 

на

cnn.add(Dense(units = 3, activation = 'softmax')) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...