Как использовать предварительно обученные функции из 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/