Мультиклассовая классификация и прогнозирование изображений Keras - PullRequest
0 голосов
/ 21 апреля 2020

Я делаю классификацию изображений с ImageDataGenerator. Мои данные имеют такую ​​структуру:

  • Поезд
    • 101
    • 102
    • 103
    • 104
  • Тест
    • 101
    • 102
    • 103
    • 104

Так что, если я правильно понял, ImageGenerator автоматически делает то, что нужно с маркировкой. Я тренирую модель и получаю некоторую точность. Теперь я хочу сделать прогноз.

- model.predict
- model.predict_proba
- model.predict_classes

Все это дает мне одинаковое значение. Можете ли вы быстро объяснить или сослаться (я не могу найти ничего касающегося моей проблемы), как мне действовать, или, может быть, я сделал что-то ужасное в коде. Самая большая проблема, я не понимаю, как результат будет отличаться для 4 разных классов. Поскольку predict_classes дает мне вывод [[1]], не должен ли он дать мне предсказанный класс?

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, MaxPool2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.regularizers import l1, l2, l1_l2

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

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

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

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(100, activation='relu', activity_regularizer=l1(0.001)))
#model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('softmax'))

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

batch_size = 32

# augmentation configuration for train
train_datagen = ImageDataGenerator(
        rotation_range=30,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=False,
        vertical_flip=True,
        fill_mode = 'nearest')

# augmentation configuration for testing, only rescale
test_datagen = ImageDataGenerator(rescale=1./255)

# reading pictures and  generating batches of augmented image data

train_generator = train_datagen.flow_from_directory(
        '/media/data/working_dir/categories/readytotest/train',
        target_size=(480, 640),
        batch_size=batch_size,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        '/media/data/working_dir/categories/readytotest/test',
        target_size=(480, 640),
        batch_size=batch_size,
        class_mode='binary')

model.fit_generator(
        train_generator,
        steps_per_epoch=800 // batch_size,
        epochs=15,
        validation_data=validation_generator,
        validation_steps=800 // batch_size)

1 Ответ

0 голосов
/ 21 апреля 2020

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

(...)
model.add(Dense(CLS_SZ))
model.add(Activation('softmax'))
(...)

# I am not sure about this read some docs about generator you used.
train_generator = train_datagen.flow_from_directory(
        '/media/data/working_dir/categories/readytotest/train',
        target_size=(480, 640),
        batch_size=batch_size,
        class_mode=None)

validation_generator = test_datagen.flow_from_directory(
        '/media/data/working_dir/categories/readytotest/test',
        target_size=(480, 640),
        batch_size=batch_size,
        class_mode=None)

...