Tensorflow Hub vs приложение Keras - падение производительности

У меня проблема с классификацией изображений, и я хочу использовать для этой задачи предварительно обученные модели Keras. Когда я использую такую ​​модель

model = tf.keras.Sequential([
    hub.KerasLayer("https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4",
                   output_shape=[1280],
                   trainable=False),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(num_classes, activation='softmax')
])
model.build([None, image_size[0], image_size[1], 3])

model.compile(
    optimizer=tf.keras.optimizers.Adam(),
    loss='categorical_crossentropy',
    metrics=['acc'])

Я легко получаю точность ~ 90% и очень низкие потери на сбалансированном наборе данных. Однако, если использовать keras.application следующим образом:

`base_model = tf.keras.applications.mobilenet_v2.MobileNetV2(
    input_shape=input_img_size,
    include_top=False,
    weights='imagenet'
)

base_model.trainable = False  

model = tf.keras.layers.Dropout(0.5)(model)

model = tf.keras.layers.Dense(num_classes, activation='softmax')(model)

model = tf.keras.models.Model(inputs=base_model.input, outputs=model)

model.compile(
    optimizer=tf.keras.optimizers.Adam(),
    loss='categorical_crossentropy',
    metrics=['acc'])`

и используйте правильную функцию tf.keras.application.mobilenet_v2.preprocess_input в генераторе данных (и оставив все остальное без изменений), он застрял примерно на 60% валидации и 80% обучении. в чем разница между этими подходами? почему один лучше другого?

Генератор данных:

datagen = tf.keras.preprocessing.image.ImageDataGenerator(
        preprocessing_function = preprocessing_function,
        rotation_range=10,
        zoom_range=0.3,
        width_shift_range=0.2,
        height_shift_range=0.2,
        horizontal_flip=True,
        vertical_flip=True,
        shear_range=0.2,
    )

Обучение:

 history = model.fit_generator(
    train_generator,
    epochs=nb_epochs,
    verbose=1,
    steps_per_epoch=steps_per_epoch,
    validation_data=valid_generator,
    validation_steps=val_steps_per_epoch,
    callbacks=[
        checkpoint,
        learning_rate_reduction,
        csv_logger,
        tensorboard_callback,
    ],
)

person bartek wojcik    schedule 29.10.2019    source источник
comment
Кстати, я спрашиваю не о разнице между последовательными и функциональными API, а о модулях TF.Hub и keras.application.   -  person bartek wojcik    schedule 29.10.2019
comment
этот ответ может быть полезным stackoverflow.com/questions/60251715/   -  person lbcommer    schedule 10.03.2020


Ответы (1)


Я считаю, что вы тренируете две разные «модели». В вашем примере TensorFlow Hub вы использовали вектор функций мобильной сети. Вектор признаков, как я понимаю, не то же самое, что модель. Это одномерный тензор определенной длины. Вероятно, это последний уровень перед выходом модели мобильной сети. Это отличается от примера tf.keras, где вы вызываете полную модель мобильной сети.

person Rick Blaine    schedule 30.09.2020