Как использовать предварительно обученные функции из VGG-16 в качестве входных данных для слоя GlobalAveragePooling2D() в Keras

Можно ли использовать предварительно обученные функции модели из VGG-16 и перейти на уровень GlobalAveragePooling2D() другой модели в Keras?

Пример кода для хранения автономных функций сети VGG-16:

model = applications.VGG16(include_top=False, weights='imagenet')
bottleneck_features_train = model.predict(input)

Пример кода для топ-модели:

model = Sequential()
model.add(GlobalAveragePooling2D()) # Here I want to use pre-trained feature from VGG-16 net as input.

Я не могу использовать слой Flatten(), так как я хочу предсказать мульти-метки с несколькими классами.

1 ответ

Решение

Конечно, вы определенно можете. У вас есть несколько вариантов:

pooling kwarg

Использовать pooling kwarg в конструкторе VGG16, который заменяет последний слой пула указанным типом. т.е.

model_base = keras.applications.vgg16.VGG16(include_top=False, input_shape=(*IMG_SIZE, 3), weights='imagenet', pooling="avg")

Добавление слоев в вывод

Вы также можете добавить больше слоев в предварительно обученную модель:

from keras.models import Model

model_base = keras.applications.vgg16.VGG16(include_top=False, input_shape=(*IMG_SIZE, 3), weights='imagenet')
output = model_base.output
output = GlobalAveragePooling2D()(output)
# Add any other layers you want to `output` here...
model = Model(model_base.input, output)
for layer in model_base.layers:
    layer.trainable = False

Эта последняя строка замораживает предварительно подготовленные слои, так что вы сохраняете особенности предварительно подготовленной модели и просто обучаете новые слои.

Я написал пост в блоге, в котором рассказывается об основах работы с предварительно подготовленными моделями и их расширении для работы над различными проблемами классификации изображений; здесь также есть ссылка на некоторые примеры рабочего кода, которые могут предоставить больше контекста: http://innolitics.com/10x/pretrained-models-with-keras/

Другие вопросы по тегам