Трансферное обучение по модели keras всегда дает одинаковые прогнозы - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь обучить классификатор изображений с помощью модуля приложений keras. Когда я запускаю прогнозы для набора проверки, все изображения предсказываются как один и тот же класс. Это не всегда один и тот же класс, он меняется во время обучения. Я использую MobileNetV2 с весами из ImageNet, но я также пробовал другие модели с тем же результатом.

Я пытался использовать модель из концентратора TensorFlow, как описано в этом руководстве: https://www.tensorflow.org/beta/tutorials/images/hub_with_keras, и он работал нормально, поэтому это не проблема с набором данных.

Мой фрагмент кода:

image_size = 224
batch_size = 32
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input)
validation_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input)
train_generator = train_datagen.flow_from_directory(training_data_dir,
                                                    target_size=(image_size, image_size),
                                                    batch_size=batch_size)
validation_generator = train_datagen.flow_from_directory(validation_data_dir,
                                                         target_size=(image_size, image_size),
                                                         batch_size=batch_size)

IMG_SHAPE = (image_size, image_size, 3)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights="imagenet")
base_model.trainable = False

model = tf.keras.Sequential([
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(train_generator.num_classes, activation='softmax')
])
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.001),
              loss="categorical_crossentropy",
              metrics=["accuracy"])
model.summary()

batch_stats = CollectBatchStats()
epoch_stats = CollectEpochStats(model, validation_generator)
checkpoint = tf.keras.callbacks.ModelCheckpoint(...)

epochs = 10
steps_per_epoch = train_generator.n // train_generator.batch_size
validation_steps = validation_generator.n // validation_generator.batch_size

history = model.fit_generator(train_generator,
                              epochs=epochs,
                              steps_per_epoch=steps_per_epoch,
                              callbacks=[batch_stats, epoch_stats, checkpoint],
                              workers=4,
                              validation_data=validation_generator,
                              validation_steps=validation_steps)

1 Ответ

0 голосов
/ 28 июня 2019

Проблема решена: в моем коде после компиляции модели были следующие строки:

sess = keras_backend.get_session()
init = tf.compat.v1.global_variables_initializer()
sess.run(init)

После их удаления все работает нормально.

...