如何从 VGG 层创建 Keras Model()
How to create Keras Model() from VGG layers
我使用 VGG16 基础创建了一个自定义 Keras 模型,我训练并保存了它:
from keras.applications import VGG16
from keras import models
from keras import layers
conv_base = VGG16(weights="imagenet", include_top=False)
model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation="relu"))
model.add(layers.Dense(1, activation="sigmoid"))
...
model.save("models/custom_vgg16.h5")
在另一个脚本中,我现在想加载保存的网络并从中创建一个新的 Keras Model
对象,使用自定义网络输入和 VGG16 层作为输出:
from keras.models import load_model
from keras import Model
model_vgg16 = load_model("models/custom_vgg16.h5")
layer_outputs = [layer.output for layer in model_vgg16.get_layer("vgg16").layers[1:]]
activation_model = Model(inputs=model_vgg16.get_layer("vgg16").get_input_at(1), outputs=layer_outputs)
但是最后一行导致以下错误:
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(?, 150, 150, 3), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []
有什么想法我可能在这里遗漏了什么吗?
您想在最后一行的节点索引 0 处获取输入:
model_vgg16.get_layer('vgg16').get_input_at(0)
您也可以通过直接从模型中选择输入来获取输入节点。
model_vgg16.input
您必须输入有关图片大小的信息
例如
如果您的图片大小为 150,150,3,那么试试这个
model = models.Sequential()
model.add(conv_base)
model.add(Input(shape=(150,150,3)))
model.add(layers.Flatten())
model.add(layers.Dense(256, activation="relu"))
model.add(layers.Dense(1, activation="sigmoid"))
我使用 VGG16 基础创建了一个自定义 Keras 模型,我训练并保存了它:
from keras.applications import VGG16
from keras import models
from keras import layers
conv_base = VGG16(weights="imagenet", include_top=False)
model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation="relu"))
model.add(layers.Dense(1, activation="sigmoid"))
...
model.save("models/custom_vgg16.h5")
在另一个脚本中,我现在想加载保存的网络并从中创建一个新的 Keras Model
对象,使用自定义网络输入和 VGG16 层作为输出:
from keras.models import load_model
from keras import Model
model_vgg16 = load_model("models/custom_vgg16.h5")
layer_outputs = [layer.output for layer in model_vgg16.get_layer("vgg16").layers[1:]]
activation_model = Model(inputs=model_vgg16.get_layer("vgg16").get_input_at(1), outputs=layer_outputs)
但是最后一行导致以下错误:
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(?, 150, 150, 3), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []
有什么想法我可能在这里遗漏了什么吗?
您想在最后一行的节点索引 0 处获取输入:
model_vgg16.get_layer('vgg16').get_input_at(0)
您也可以通过直接从模型中选择输入来获取输入节点。
model_vgg16.input
您必须输入有关图片大小的信息 例如 如果您的图片大小为 150,150,3,那么试试这个
model = models.Sequential()
model.add(conv_base)
model.add(Input(shape=(150,150,3)))
model.add(layers.Flatten())
model.add(layers.Dense(256, activation="relu"))
model.add(layers.Dense(1, activation="sigmoid"))