保存并从磁盘重新加载后获取 Keras 模型的(输入)层
Get (input) layer of Keras model after saving and re-loading it from disk
我已经通过 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 模型的(输入)层?
我的方法是先打印模型所有层的名称,然后通过名称调用层。
例如:
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
将 VGG16 模型添加到您的自定义模型后,它将有两个输入节点:一个是可以使用 conv_base.get_input_at(0)
访问的原始输入节点,另一个是为您的输入创建的输入节点可以使用 conv_base.get_input_at(1)
访问的自定义模型(这实际上是模型的输入,相当于 model.input
)。 Keras中节点和层的区别在.
中有详细解释
我已经通过 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 模型的(输入)层?
我的方法是先打印模型所有层的名称,然后通过名称调用层。
例如:
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
将 VGG16 模型添加到您的自定义模型后,它将有两个输入节点:一个是可以使用 conv_base.get_input_at(0)
访问的原始输入节点,另一个是为您的输入创建的输入节点可以使用 conv_base.get_input_at(1)
访问的自定义模型(这实际上是模型的输入,相当于 model.input
)。 Keras中节点和层的区别在