Как удалить слои из модели keras, чтобы использовать их в качестве основы для создания другой модели - PullRequest
1 голос
/ 01 августа 2020

Мне нужно использовать предварительно обученную модель в Keras (keras.applications.VGG16) в качестве основы для создания другой модели (для выполнения трансферного обучения) из ее первых слоев. Конечная цель - заморозить и экспортировать модель для развертывания на Raspberry Pi с помощью AIY Vision Kit.

Я пробовал общий подход:

model_base = keras.applications.VGG16(input_tensor=inputs)
x = model_base.get_layer(backbone_layer).output
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(1)(x)
model = keras.models.Model(inputs=inputs, outputs=x)

Я также пытаюсь использовать:

model_base._layers.pop() 

Я вызываю pop () n раз, где «n» - это количество последних слоев, от которых я хочу избавиться.

И, похоже, это работает в обоих случаях , когда я использую new_model.summary (), он показывает только желаемые первые слои модели VGG16 плюс новые слои, добавленные для настройки, однако при экспорте модели и ее компиляции для tf-lite компилятор возвращает:

Недостаточно памяти на устройстве для запуска модели

Что странно, так как полученная модель даже меньше (файл .pb и количество слоев), чем другие модели, определенные вручную, которые могут быть правильно импортировано, после анализа тензорной доски и экспорта файла .pb в виде текста я обнаружил, что исходная модель тоже экспортируется (все слои, даже те, которые не используются и удаляются с помощью pop ()), а не только новый * 1 017 *

(как видно на тензорной доске, есть 2 параллельные модели, справа желаемая, но исходные слои исходной модели по-прежнему отображаются слева, также эта часть исходной модели присутствует в экспортированной .pb файл)

введите описание изображения здесь

У меня вопрос, как я могу точно удалить неиспользуемые слои из модели keras.applications.VGG16 и просто сохранить первые слои + новые пользовательские слои? использование pop () не сработало, также безуспешно пробовал слой del (для l oop).

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

Ответы [ 3 ]

2 голосов
/ 01 августа 2020

Самый простой способ - в VGG16 установить include_top = False, pooling = max. Тогда посмотрите код ниже:

x=backbone.layers[-1].output
predictions=Dense (len(classes), activation='softmax')(x)
model = Model(inputs=backbone.input, outputs=predictions)    
model.compile(Adamax(lr=lr_rate), loss='categorical_crossentropy', metrics=['accuracy'])
0 голосов
/ 08 августа 2020
• 1000 показывает только нужные слои, а замороженный график генерирует файл .pb меньшего размера.

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

Недостаточно памяти на устройстве для запуска модели.

Но это другой вопрос, который прямо не задается в этом вопросе.

0 голосов
/ 01 августа 2020

Это фактически не удаление слоя (-ов), а создание новой модели без него.

Я не совсем понимаю, что вы хотите сделать, но детекторы объектов обычно делают это.

inputs = keras.layers.Input((None, None, 3), include_top=False)
backbone = keras.applications.VGG16(input_tensor=inputs)
x = backbone.get_layer('block1_conv2').output
x = keras.layers.Dense(50)(x)
model = keras.models.Model(inputs=inputs, outputs=x, name=backbone.name)

Это приведет к модели только с первыми двумя слоями и добавит новый Dense в качестве вывода.

...