Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保存并从磁盘重新加载Keras模型后获取(输入)层_Python_Keras_Keras Layer_Vgg Net - Fatal编程技术网

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

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

我已通过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\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