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?
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.
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!
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.
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
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.
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