Keras | Как запустить пример Inception v3

Я пытаюсь изучить синтаксис Keras и играть с Вводным примером v3

У меня есть 4-классная многоклассовая игрушка для классификации, поэтому я изменил следующие строки из примера:

NB_CLASS = 4  # number of classes
DIM_ORDERING = 'tf'  # 'th' (channels, width, height) or 'tf' (width, height, channels)

Мои наборы игрушек имеют следующие размеры:

  • Размер массива, содержащий все изображения: (595, 299, 299, 3)
  • Размер массива, содержащего учебные изображения: (416, 299, 299, 3)
  • Размер массива, содержащего метки тренировки: (179, 4)
  • Размер массива, содержащего тестовые изображения: (179, 299, 299, 3)
  • Размер массива, содержащий тестовые метки: (179, 4)

Затем я попытаюсь обучить модель следующим кодом:

# fit the model on the batches generated by datagen.flow()
#  https://github.com/fchollet/keras/issues/1627
#    http://keras.io/models/sequential/#sequential-model-methods
checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True)
model.fit_generator(datagen.flow(X_train, Y_train,
                batch_size=32),
                nb_epoch=10,
                samples_per_epoch=32,
                class_weight=None, #classWeights,
                verbose=2,
                validation_data=(X_test, Y_test),
                callbacks=[checkpointer])

Затем я получаю следующую ошибку:

Exception: The model expects 2 input arrays, but only received one array. Found: array with shape (179, 4)`

Скорее всего, это связано с тем, что Inception хотел бы иметь вспомогательные классификаторы (Szegedy et al., 2014):

model = Model(input=img_input, output=[preds, aux_preds])

Как присвоить две метки методу в Keras, не являющемся продвинутым программистом на Python?

Ответы

Ответ 1

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

В первой части вы увидите, как загрузить данные из каталога, используя:

.flow_from_directory(
   train_data_dir,
   target_size=(img_width, img_height),
   batch_size=batch_size,
   class_mode='binary')

Чтобы вводить разные классы, вам нужно поместить изображения в одну папку для каждого класса (обратите внимание, что, возможно, есть еще один способ сделать это, передав метки). Также обратите внимание, что в вашем случае class_mode не может использовать "двоичный" (я думаю, вы должны использовать "категориальный" ):

`"binary"`: binary targets (if there are only two classes),
`"categorical"`: categorical targets,

Затем вы можете использовать модель inceptionv3, которая уже находится в Keras:

from keras.applications import InceptionV3    
cnn = InceptionV3(...)

Также обратите внимание, что у вас слишком мало примеров для обучения InceptionV3, так как эта модель очень большая (проверьте здесь размер). Что вы можете сделать в этом случае, это передача обучения, используя предварительно подготовленные веса на InceptionV3. См. Раздел Использование узких мест в обученной сети: точность в 90% в минуту учебник.