web-dev-qa-db-fra.com

Dans Keras, comment obtenir le nom de la couche associé à un objet "Modèle" contenu dans mon modèle?

J'ai construit un modèle séquentiel avec le réseau VGG16 à la base initiale, par exemple: 

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'))

Mon modèle ressemble à ceci: 

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
_________________________________________________________________

Maintenant, je veux obtenir les noms de couche associés à la portion de modèle vgg16 de mon réseau. C'est à dire. quelque chose comme: 

layer_name = 'block3_conv1'
filter_index = 0

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

Cependant, étant donné que la convolution vgg16 est présentée comme un modèle et que ses couches ne sont pas exposées, le message d'erreur suivant s'affiche: 

ValueError: pas de couche de ce type: block3_conv1

Comment puis-je faire cela? 

4
Ryan Chase

Pour obtenir le nom de la couche à partir de l'instance VGG16, utilisez le code suivant.

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

le nom devrait être le même à l'intérieur de votre modèle. pour montrer cela, vous pouvez faire ce qui suit.

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

comme Ryan nous a montré. Pour appeler la couche vgg16, vous devez d'abord l'appeler à partir du modèle à l'aide de la méthode get_layer. 

1
Liam9905