Прогнозирование изображений ноутбука Jupyter - PullRequest
1 голос
/ 04 мая 2020

Для моего первого опыта машинного обучения у меня есть базовая классификация c.

У меня есть 3 разные папки:

train_path = './dataset/pneumonia/train/'
test_path = './dataset/pneumonia/test/'
val_path = './dataset/pneumonia/val/

каждая папка:

os.listdir(train_path)

возвращает

['NORMAL', 'PNEUMONIA']

В каждом наборе:

  • Тренировочный набор:
    • Обычный: 949
    • Пневмония: 949
  • Тестовый набор:
    • Нормальный: 317
    • Пневмония: 317
  • Валидация установлена:
    • Нормально: 317
    • Пневмония: 317

Я использую tenorflow:

from tensorflow.keras.preprocessing.image import ImageDataGenerator
image_gen = ImageDataGenerator(
    rotation_range=10,        # rotate the image 10 degrees
    width_shift_range=0.10,   # Shift the pic width by a max of 5%
    height_shift_range=0.10,  # Shift the pic height by a max of 5%
    rescale=1/255,            # Rescale the image by normalzing it.
    shear_range=0.1,          # Shear means cutting away part of the image (max 10%)
    zoom_range=0.1,           # Zoom in by 10% max
    horizontal_flip=True,     # Allow horizontal flipping
    fill_mode='nearest'       # Fill in missing pixels with the nearest filled value
)


image_gen.flow_from_directory(train_path)
image_gen.flow_from_directory(test_path)

Я создаю модель (базовая c модель):

model = Sequential()

model.add(Conv2D(32, (3, 3), input_shape=(image_width, image_height, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3), input_shape=(image_width, image_height, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), input_shape=(image_width, image_height, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, (3, 3), input_shape=(image_width, image_height, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(512, (3, 3), input_shape=(image_width, image_height, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(512, activation='relu'))

# Dropouts help reduce overfitting by randomly turning neurons off during training.
# Here we say randomly turn off 50% of neurons.
model.add(Dropout(0.5))

# Last layer, remember its binary so we use sigmoid
model.add(Dense(1, activation='sigmoid'))

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

Затем я тренирую ее:

train_image_gen = image_gen.flow_from_directory(
    train_path,
    target_size=image_shape[:2],
    color_mode='rgb',
    batch_size=batch_size,
    class_mode='binary'
)

results = model.fit_generator(train_image_gen,epochs=20,
                              validation_data=test_image_gen,
                             callbacks=[early_stop, board])

Пока хорошие результаты верны:

pred_probabilities = model.predict_generator(test_image_gen)
predictions = pred_probabilities > 0.5
confusion_matrix(test_image_gen.classes,predictions)

Я получаю довольно хорошие результаты:

enter image description here enter image description here

Моя проблема в том, что когда я хочу предсказать изображения, он возвращает результаты, далекие от правильных:

val_image_gen = image_gen.flow_from_directory(
    val_path,
    target_size=image_shape[:2],
    color_mode='rgb',
    class_mode='binary',
)

pred_probabilities = model.predict_generator(val_image_gen)
predictions = pred_probabilities > 0.5

Вот некоторые результаты, которые я получаю:

              precision    recall  f1-score   support

           0       0.51      0.57      0.53       317
           1       0.51      0.44      0.47       317

    accuracy                           0.51       634
   macro avg       0.51      0.51      0.50       634
weighted avg       0.51      0.51      0.50       634

Матрица путаницы в этом наборе данных следующая:

[[180 137]
 [176 141]]

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я заменил:

val_image_gen = image_gen.flow_from_directory(
    val_path,
    target_size=image_shape[:2],
    color_mode='rgb',
    class_mode='binary',
)

на:

val_image_gen = image_gen.flow_from_directory(
    val_path,
    target_size=image_shape[:2],
    color_mode='rgb',
    batch_size=batch_size,
    class_mode='binary',
    shuffle=False
)

Я получаю хорошие результаты:

[[ 269 48]

[3 314 ]]

0 голосов
/ 04 мая 2020

Несколько проблем с вашим кодом:

  • Вы используете набор тестов для проверки и набор для проверки. Это может быть проблемой или нет, в зависимости от ваших данных и того, как они были разделены.
  • Увеличение должно применяться только к тренировочному набору. Для тестирования и проверки используйте отдельный экземпляр ImageDataGenerator(rescale=1/255).

Результаты вашего теста выглядят так, как будто они получены от неподготовленной модели. Проверьте, совпадает ли объект model, на котором вы выполняете тестирование, с которым вы тренировались. Возможно, вы захотите использовать функции model.save() и load_model() для сохранения веса модели после тренировки.

...