在 Keras 中,如何获取与模型中包含的“模型”对象关联的图层名称?

Posted

技术标签:

【中文标题】在 Keras 中,如何获取与模型中包含的“模型”对象关联的图层名称?【英文标题】:In Keras, how to get the layer name associated with a "Model" object contained in my model? 【发布时间】:2018-10-21 08:53:32 【问题描述】:

我在初始基础上用VGG16网络构建了一个Sequential模型,例如:

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 模型部分关联的层名称。 IE。类似于:

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

我该怎么做?

【问题讨论】:

【参考方案1】:

关键是先在Model对象上做.get_layer,然后在指定具体vgg16层的那个上再做一个.get_layer,然后做.output:

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

【讨论】:

【参考方案2】:

要从 VGG16 实例中获取层的名称,请使用以下代码。

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

模型中的名称应该相同。为了证明这一点,您可以执行以下操作。

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

就像 Ryan 向我们展示的那样。要调用 vgg16 层,您必须首先使用 get_layer 方法从模型中调用它。

【讨论】:

【参考方案3】:

可以简单地将层的名称存储在列表中以供进一步使用

layer_names=[layer.name for layer in base_model.layers]

【讨论】:

【参考方案4】:

这对我有用:)

for idx in range(len(model.layers)):
  print(model.get_layer(index = idx).name)

【讨论】:

以上是关于在 Keras 中,如何获取与模型中包含的“模型”对象关联的图层名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何生成属性名称,并在 Rails 模型中获取它们的值

Keras:如何在顺序模型中获取图层形状

Keras深度学习实战(28)——利用单词向量构建情感分析模型

如何在keras中包装张量流RNNCell?

C#开发BIMFACE系列24 服务端API之获取模型数据9:获取单个房间信息

sklearn 管道 + keras 顺序模型 - 如何获取历史记录?