Shgidi
Shgidi

Reputation: 154

Can I remove layers in a pre-trained Keras model?

I'm importing a pre-trained VGG model in Keras, with

from keras.applications.vgg16 import VGG16

I've noticed that the type of a standard model is keras.models.Sequential, while a pre-trained model is keras.engine.training.Model. I usually add and remove layers with add and pop for sequential models respectively, however, I cannot seem to use pop with pre-trained models.

Is there an alternative to pop for these type of models?

Upvotes: 2

Views: 4107

Answers (1)

Reece Stevens
Reece Stevens

Reputation: 454

Depends on what you're wanting to remove. If you want to remove the last softmax layer and use the model for transfer learning, you can pass the include_top=False kwarg into the model like so:

from keras.applications.vgg16 import VGG16
IN_SHAPE = (256, 256, 3) # image dimensions and RGB channels

pretrained_model = VGG16(
  include_top=False,
  input_shape=IN_SHAPE,
  weights='imagenet'
)

I wrote a blog post on this use case recently that has some code examples and goes into a bit more detail: http://innolitics.com/10x/pretrained-models-with-keras/

If you're wanting to modify the model architecture more than that, you can access the pop() method via pretrained_model.layers.pop(), as is explained in the link @indraforyou posted.

Side note: When you're modifying layers in a pretrained model, it can be especially helpful to have a visualization of the structure and input/output shapes. pydot and graphviz is particularly useful for this:

import pydot
pydot.find_graphviz = lambda: True
from keras.utils import plot_model
plot_model(model, show_shapes=True, to_file='../model_pdf/{}.pdf'.format(model_name))

Upvotes: 1

Related Questions