During some feature extraction experiments, I noticed that the 'model.pop()' functionality is not working as expected. For a pretrained model like vgg16, after using 'model.pop()' , model.summary() shows that the layer has been removed (expected 4096 features), however on passing an image through the new model, it results in the same number of features (1000) as the original model. No matter how many layers are removed including a completely empty model, it generates the same output. Looking for your guidance on what might be the issue.
#Passing an image through the full vgg16 model
model = VGG16(weights = 'imagenet', include_top = True, input_shape = (224,224,3))
img = image.load_img( 'cat.jpg', target_size=(224,224) )
img = image.img_to_array( img )
img = np.expand_dims( img, axis=0 )
img = preprocess_input( img )
features = model.predict( img )
features = features.flatten()
print(len(features)) #Expected 1000 features corresponding to 1000 imagenet classes
1000
model.layers.pop()
img = image.load_img( 'cat.jpg', target_size=(224,224) )
img = image.img_to_array( img )
img = np.expand_dims( img, axis=0 )
img = preprocess_input( img )
features2 = model.predict( img )
features2 = features2.flatten()
print(len(features2)) #Expected 4096 features, but still getting 1000. Why?
#No matter how many layers are removed, the output is still 1000
1000
Thank you!
See full code here: https://github.com/keras-team/keras/files/1592641/bug-feature-extraction.pdf
Note that there's also a corresponding pop() method to remove layers: a Sequential model behaves very much like a list of layers. Also note that the Sequential constructor accepts a name argument, just like any layer or model in Keras.
Keras Applications are deep learning models that are made available alongside pre-trained weights. These models can be used for prediction, feature extraction, and fine-tuning. Weights are downloaded automatically when instantiating a model.
Working off @Koul answer.
I believe you don't need to use the pop
method. Instead just pass the layer before the output layer as the argument for the Model
method's output parameter:
from keras.models import Model
model2 = Model(model.input, model.layers[-2].output)
model2.summary()
Found the answer here : https://github.com/keras-team/keras/issues/2371#issuecomment-308604552
from keras.models import Model
model.layers.pop()
model2 = Model(model.input, model.layers[-1].output)
model2.summary()
model2 behaves correctly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With