Не знаете, нужно ли менять class_mode с двоичного на категориальный в Imagedatagenerator

Когда я перешел с 2 классов на 4 в модели CNN. У меня есть ошибки. Многие люди помогли мне их решить, например, мне нужно было изменить убыток наsparse_categorical_crossentropy и функция активации последнего слоя.

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

history = model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples//batch_size,
    epochs=epochs,
    validation_data = validation_generator, 
    validation_steps = validation_generator.samples // batch_size,
)

Я смущен, так как мне пришлось изменить функцию потерь с binary_crossentropy к categorical_crossenpropy. Я хочу знать, следует ли мне изменить class_mode с двоичного на категориальный для 4 классов или оставить его как двоичный.

train_datagen=ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip = True,
    #vertical_flip = True,
    validation_split=0.2,
    brightness_range=[0.5, 1.5]

)

#test_datagen = ImageDataGenerator(
 #   rescale=1./255,
 #   
#)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width,img_height),
    batch_size=batch_size,
    shuffle=True,
    class_mode='binary',
    subset='training'
)

validation_generator = train_datagen.flow_from_directory(
    train_data_dir, # same directory as training data
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary',
    subset='validation'
    #validation_data_dir,
    #target_size=(img_width,img_height),
    #batch_size=batch_size,
    #class_mode='binary'
)

2 ответа

Решение

Я думаю, что чтение документации будет хорошей отправной точкой. Он ответит на все ваши вопросы, а затем и на некоторые.

class_mode: одно из значений "категориальный", "двоичный", "разреженный", "входной" или "Нет". По умолчанию: "категоричный". Определяет тип возвращаемых массивов меток: - "категориальный" будет двухмерными метками с горячим кодированием, - "двоичный" будет 1D двоичными метками, "разреженный" будет представлять собой одномерные целочисленные метки, - "вход" будет идентичными изображениям для ввода изображений (в основном используется для работы с автокодерами). - Если None, метки не возвращаются (генератор будет выдавать только пакеты данных изображения, что полезно использовать с model.predict_generator()). Обратите внимание, что в случае class_mode None данные все равно должны находиться в подкаталоге каталога, чтобы они работали правильно.

Итак, вы должны использовать categorical_crossentropy как функцию потерь, если вы выберете categorical за class_mode, а также sparse_categorical_crossentropy если вы выберете sparse.

Конечно, вы должны это изменить. Если у вас всего 2 класса, используйтеclass_mode='binary' в flow_from_directory функция и binary_crossentropyкак потеря. Если у вас более 2 классов, используйтеclass_mode='categorical' а также categorical_crossentropy

Другие вопросы по тегам