Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Keras, how to get the layer name associated with a "Model" object contained in my model?

I built a Sequential model with the VGG16 network at the initial base, for example:

from keras.applications import VGG16 conv_base = VGG16(weights='imagenet',                   # do not include the top, fully-connected Dense layers                    include_top=False,                   input_shape=(150, 150, 3))  from keras import models from keras import layers  model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation='relu')) # the 3 corresponds to the three output classes model.add(layers.Dense(3, activation='sigmoid')) 

My model looks like this:

model.summary() 

Layer (type)                 Output Shape              Param #    ================================================================= vgg16 (Model)                (None, 4, 4, 512)         14714688   _________________________________________________________________ flatten_1 (Flatten)          (None, 8192)              0          _________________________________________________________________ dense_7 (Dense)              (None, 256)               2097408    _________________________________________________________________ dense_8 (Dense)              (None, 3)                 771        ================================================================= Total params: 16,812,867 Trainable params: 16,812,867 Non-trainable params: 0 _________________________________________________________________ 

Now, I want to get the layer names associated with the vgg16 Model portion of my network. I.e. something like:

layer_name = 'block3_conv1' filter_index = 0  layer_output = model.get_layer(layer_name).output loss = K.mean(layer_output[:, :, :, filter_index]) 

However, since the vgg16 convolutional is shown as a Model and it's layers are not being exposed, I get the error:

ValueError: No such layer: block3_conv1

How do I do this?

like image 473
Ryan Chase Avatar asked May 11 '18 01:05

Ryan Chase


People also ask

How do I get a Keras layer name?

Every layer of the Keras model has a unique name. e.g. "dense_1", "dense_2" etc. Keras has a function for getting a layer with this unique name. So you need just to call that function and pass a name for the layer.

How do you name a dense layer in Keras?

keras API now do not allow renaming layers via layer.name = "new_name" . Instead you must assign your new name to the private attribute, layer. _name . So we see the layers now have the new names!

What is model subclassing in Keras?

In Model Sub-Classing there are two most important functions __init__ and call. Basically, we will define all the tf. keras layers or custom implemented layers inside the __init__ method and call those layers based on our network design inside the call method which is used to perform a forward propagation.


2 Answers

The key is to first do .get_layer on the Model object, then do another .get_layer on that specifying the specific vgg16 layer, THEN do .output:

layer_output = model.get_layer('vgg16').get_layer('block3_conv1').output

like image 88
Ryan Chase Avatar answered Sep 18 '22 12:09

Ryan Chase


To get the name of the layer from the VGG16 instance use the following code.

for layer in conv_base.layers:     print(layer.name) 

the name should be the same inside your model. to show this you could do the following.

print([layer.name for layer in model.get_layer('vgg16').layers]) 

like Ryan showed us. to call the vgg16 layer you must call it from the model first using the get_layer method.

like image 31
Liam9905 Avatar answered Sep 20 '22 12:09

Liam9905