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

Когда я перешел с 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 ]

3 голосов
/ 29 мая 2020

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

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

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

1 голос
/ 29 мая 2020

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

...