Python 保存并从磁盘重新加载Keras模型后获取(输入)层
我已通过Keras加载、扩展、训练VGG16网络,然后将其保存到磁盘:Python 保存并从磁盘重新加载Keras模型后获取(输入)层,python,keras,keras-layer,vgg-net,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.s
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\u base访问。在(0)
处获取输入;另一个是为自定义模型中的输入创建的输入节点,可使用conv\u base访问。在(1)
(这实际上是模型的输入,相当于model.input
)。Keras中节点和层之间的区别已在中详细解释。谢谢,但我如何知道在(1)处获取输入
将等于模型。在我的情况下输入是吗?@Matthias确实如此,因为这是模型的输入张量。您可以使用断言conv\u base来验证它。在(1)处获取输入是model.input
。我相信-只是,如果你不告诉我,我怎么知道?我在哪里可以看到索引#1而不是#0是模型的输入?@Matthias好吧,在你创建了VGG模型之后,也就是说,conv_base=VGG16(…)
,只有一个索引为0的输入节点。换句话说,conv#u base.get_input_at(1)
将引发错误。将conv_base
添加到自定义模型作为其基础后,将在内部创建一个输入张量,表示模型的输入张量(即model.input
)并将连接到conv_base
,作为其索引为1的第二个输入节点。因此,我们将拥有conv_base。在(1)处获取输入是模型。输入求值为True
。