Как в Keras получить имя слоя, связанное с объектом модели, содержащимся в моей модели?

Я построил последовательную модель с сетью VGG16 в начальной базе, например:

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

Моя модель выглядит так:

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
_________________________________________________________________

Теперь я хочу получить имена слоев, связанные с частью моей сети vgg16 Model. Т.е. что-то вроде:

layer_name = 'block3_conv1'
filter_index = 0

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

Однако, поскольку сверточный объект vgg16 показан как модель, а его слои не отображаются, я получаю сообщение об ошибке:

ValueError: такого уровня нет: block3_conv1

Как мне это сделать?


person Ryan Chase    schedule 11.05.2018    source источник


Ответы (4)


Ключ состоит в том, чтобы сначала сделать .get_layer для объекта Model, затем сделать еще .get_layer для этого, указав конкретный уровень vgg16, ЗАТЕМ выполните .output:

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

person Ryan Chase    schedule 11.05.2018

Чтобы получить имя слоя из экземпляра VGG16, используйте следующий код.

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

имя должно быть таким же внутри вашей модели. чтобы показать это, вы можете сделать следующее.

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

как показал нам Райан. чтобы вызвать слой vgg16, вы должны сначала вызвать его из модели, используя метод get_layer.

person Liam9905    schedule 08.11.2018

Можно просто сохранить название слоев в списке для дальнейшего использования.

layer_names=[layer.name for layer in base_model.layers]
person Akanksha Pathak    schedule 25.07.2019

Это сработало для меня :)

for idx in range(len(model.layers)):
  print(model.get_layer(index = idx).name)
person Ashutosh Soni    schedule 15.05.2020