Keras ValueError: fit_generator выдает список

Я изучаю, как работать с Keras с бэкэндом TF для распознавания изображений, поэтому я до сих пор не уверен, что я здесь делаю неправильно.

Я пытаюсь сложить 2 модели, одна из которых VGG16, а другой случайный, который я сделал, чтобы научиться его складывать. Я хочу классифицировать изображение среди 5 классов.

Проблема в последней части, когда я запускаю fit_generator. Вместо получения действительного кортежа он дает то, что выглядит как список. Я видел много людей, сталкивающихся с похожими проблемами, но в их случаях результат был None, поэтому я не уверен, что решение будет таким же.

Параметры

nb_train_samples = 576
nb_validation_samples = 144
epochs = 30
batch_size = 12
img_width, img_height = 150, 150

Генераторы

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=50,
    width_shift_range=0.3,
    height_shift_range=0.3,
    shear_range=0.4,
    zoom_range=0.4,
    horizontal_flip=True)

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,
    class_mode=None,
    shuffle=False)

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode=None,
    shuffle=False)

Моя модель

input = Input(batch_shape=model.output_shape)
x = Flatten()(input)
x = Dense(256, activation='relu', name="new_block_1")(x)
x = Dropout(0.5)(x)
x = Dense(256, activation='relu', name="new_block_2")(x)
x = Dropout(0.5)(x)
x = Dense(5, activation='softmax', name="new_block_3")(x)
top_model = Model(input,x)

input = Input(shape=(img_width, img_height, 3))
x = model(input)
x = top_model(x)
final_model = Model(input, x)

final_model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy', metrics=['accuracy'])

Подгонка и ошибка

final_model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

ValueError: output of generator should be a tuple `(x, y, sample_weight)` or `(x, y)`. Found: [[[[ 0.89411771  0.89019614  0.87450987]
   [ 0.89411771  0.89019614  0.87450987]
   [ 0.89411771  0.89019614  0.87450987]
   ..., 

Обновление 1: в соответствии с подсказкой @petezurich функция активации изменена с «sigmoid» на «softmax».


person htcoelho    schedule 19.06.2017    source источник
comment
Это может не относиться напрямую к вашему вопросу, но есть ли конкретная причина, по которой у вас есть сигмоид на последнем плотном слое, а не softmax?   -  person petezurich    schedule 19.06.2017
comment
на самом деле нет причин, но можно попробовать изменить его. Я просто пробовал материал, так что я мог скопировать его, не заметив   -  person htcoelho    schedule 19.06.2017
comment
Softmax — правильный выбор в вашем случае, поскольку он дает вам вероятность каждого из ваших 5 классов. Сигмоид был бы правильным для бинарной классификации.   -  person petezurich    schedule 19.06.2017
comment
Я понимаю. спасибо за совет :) в любом случае, я поменял его на softmax, но, к сожалению, проблема осталась   -  person htcoelho    schedule 19.06.2017
comment
Как вы получаете свои этикетки? Простым способом было бы поместить ваши изображения в подпапки для каждого класса и установить class_mode в ваших генераторах на True. Затем генератор прекрасно извлекает из этого метки классов.   -  person petezurich    schedule 19.06.2017
comment
не было True, но было «категориальное» значение, которое действительно работало. не стесняйтесь представить это как ответ, и я приму его. большое тебе спасибо :)   -  person htcoelho    schedule 19.06.2017


Ответы (1)


В вашей модели отсутствуют метки для обучения.

Просто установите class_mode в categorical в своих генераторах и поместите свои изображения в подпапки для каждого класса. Затем генератор прекрасно извлекает из этого метки классов.

person petezurich    schedule 19.06.2017