保存并从磁盘重新加载后,获取Keras模型的(输入)层

时间:2019-05-15 11:10:27

标签: python keras keras-layer vgg-net

我已经通过Keras加载,扩展,训练了VGG16网络,然后将其保存到磁盘:

from keras.applications import VGG16
from keras import models

conv_base = VGG16(weights="imagenet", include_top=False)
model = models.Sequential()
model.add(conv_base)
...
model.compile(...)
model.fit(...)
model.save("saved_model.h5")

在另一个脚本中,我再次加载经过训练的模型:

from keras.models import load_model

model_vgg16 = load_model("saved_model.h5")
model_fails = model_vgg16.get_layer("vgg16")
model_fails.input

最后一行导致以下异常:

AttributeError: Layer vgg16 has multiple inbound nodes, hence the notion of "layer input" is ill-defined. Use `get_input_at(node_index)` instead.

但是,当我直接对VGG16网络进行相同操作时,它可以正常工作:

from keras.applications import VGG16
from keras.models import load_model

model_works = VGG16(weights='imagenet', include_top=False)
model_works.input

最后一行不会导致错误。所以我的问题是:
如何访问已保存然后重新加载的Keras模型的(输入)层?

2 个答案:

答案 0 :(得分:1)

将VGG16模型添加到自定义模型后,它将具有两个输入节点:一个是可以使用conv_base.get_input_at(0)访问的原始输入节点,另一个是为自定义模型的输入创建的输入节点可以使用conv_base.get_input_at(1)进行访问(这实际上是模型的输入,等效于model.input)。 this answer中已详细说明了Keras中节点与层之间的区别。

答案 1 :(得分:0)

我的方法是先打印模型所有层的名称,然后通过其名称调用该层。

例如:

from keras.models import load_model
model_vgg16 = load_model("saved_model.h5")
mdoel_vgg16.summary()

记下所需图层的名称,然后获取图层的输入或输出

layer_input = model_vgg16.get_layer('vgg16').get_layer(layer_name).input