【问题标题】:Get (input) layer of Keras model after saving and re-loading it from disk保存并从磁盘重新加载后获取 Keras 模型的(输入)层
【发布时间】:2019-10-02 12:22:53
【问题描述】:

我已经通过 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 模型的(输入)层?

【问题讨论】:

    标签: python keras keras-layer vgg-net


    【解决方案1】:

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

    例如:

    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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,但我怎么知道get_input_at(1) 就等于model.input
      • @Matthias 确实是因为那是模型的输入张量。您可以使用assert conv_base.get_input_at(1) is model.input 进行验证。
      • 我相信——只是,如果你不告诉我,我怎么会发现?我在哪里可以看到索引 #1 但不是 #0 是模型的输入?
      • @Matthias 好吧,创建 VGG 模型后,即conv_base = VGG16(...),只有一个索引为 0 的输入节点。换句话说,conv_base.get_input_at(1) 会引发错误。在您将conv_base 添加到您的自定义模型作为其基础后,会在内部创建一个输入张量,该输入张量将表示模型的输入张量(即model.input)并将连接到conv_base 作为其第二个输入节点,其索引为1. 因此,我们将conv_base.get_input_at(1) is model.input 评估为True
      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2021-01-27
      • 2014-02-20
      • 2019-01-27
      • 1970-01-01
      • 2018-01-02
      • 2020-08-09
      • 2021-12-25
      相关资源
      最近更新 更多