在 Keras 中,如何获取与模型中包含的 "Model" 对象关联的层名称?
In Keras, how to get the layer name associated with a "Model" object contained in my model?
我在初始基础上用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: No such layer: block3_conv1
我该怎么做?
关键是首先对模型对象执行 .get_layer
,然后在指定特定 vgg16 层的对象上执行另一个 .get_layer
,然后执行 .output:
layer_output = model.get_layer('vgg16').get_layer('block3_conv1').output
要从 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 方法从模型中调用它。
可以简单地将层的名称存储在列表中以供进一步使用
layer_names=[layer.name for layer in base_model.layers]
这对我有用:)
for idx in range(len(model.layers)):
print(model.get_layer(index = idx).name)
使用层的摘要:
model.get_layer('vgg16').summary()
我在初始基础上用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: No such layer: block3_conv1
我该怎么做?
关键是首先对模型对象执行 .get_layer
,然后在指定特定 vgg16 层的对象上执行另一个 .get_layer
,然后执行 .output:
layer_output = model.get_layer('vgg16').get_layer('block3_conv1').output
要从 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 方法从模型中调用它。
可以简单地将层的名称存储在列表中以供进一步使用
layer_names=[layer.name for layer in base_model.layers]
这对我有用:)
for idx in range(len(model.layers)):
print(model.get_layer(index = idx).name)
使用层的摘要:
model.get_layer('vgg16').summary()