如何从 keras 模型中删除层以用作创建另一个模型的基线

How to remove layers from a keras model in order to use as baseline for creating another model

我需要使用 Keras 中的预训练模型 (keras.applications.VGG16) 作为从它的第一层创建另一个模型(用于进行迁移学习)的基线。最终目标是冻结并导出模型,以便在带有 AIY 视觉套件的 raspberry pi 上部署。

我试过以下常用方法:

model_base = keras.applications.VGG16(input_tensor=inputs)
x = model_base.get_layer(backbone_layer).output
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(1)(x)
model = keras.models.Model(inputs=inputs, outputs=x)

我也在尝试使用 :

model_base._layers.pop() 

我调用了 pop() n 次,其中“n”是我想要去除的最终层数。

它似乎在这两种情况下都有效,当我使用 new_model.summary() 它只显示所需的 VGG16 模型的第一层加上为自定义添加的新层,但是在导出模型和编译时它用于 tf-lite 编译器 returns:

Not enough on-device memory to run model

这很奇怪,因为生成的模型(.pb 文件和层数)比其他可以正确导入的手动定义的模型更小,在分析张量板并将 .pb 文件导出为文本后,我发现原始模型也被导出(所有层,甚至是未使用和使用 pop() 删除的层)而不仅仅是新模型

(在 tensorboard 中看到有 2 个并行模型,右边是所需的模型,但原始模型的原始层仍显示在左侧,原始模型的那部分也存在于导出中.pb 文件)

我的问题是我怎样才能从 keras.applications.VGG16 模型中删除未使用的层并只保留第一层 + 新的自定义层?使用 pop() 无效,也尝试了 del 层(在 for 循环中)失败。

或者我还有什么其他选择可以通过仅保留第一层然后将其连接到其他一些自定义层来使用预训练模型作为基线。

它实际上并不是删除层,而是创建一个没有它的新模型。

我不太明白你想做什么,但物体检测器通常会这样做。

inputs = keras.layers.Input((None, None, 3), include_top=False)
backbone = keras.applications.VGG16(input_tensor=inputs)
x = backbone.get_layer('block1_conv2').output
x = keras.layers.Dense(50)(x)
model = keras.models.Model(inputs=inputs, outputs=x, name=backbone.name)

这将生成一个只有前两层的模型,并添加一个新的 Dense 作为输出。

最简单的方法是在 VGG16 中设置 include_top=False,pooling=max。然后看下面的代码:

x=backbone.layers[-1].output
predictions=Dense (len(classes), activation='softmax')(x)
model = Model(inputs=backbone.input, outputs=predictions)    
model.compile(Adamax(lr=lr_rate), loss='categorical_crossentropy', metrics=['accuracy'])

使用 model.save() 保存所需内容,清除 tf 会话然后再次加载它解决了问题(如建议@NatthaphonHongcharoen(在评论中):

model.save(model_file)
del model
keras.backend.clear_session()
model = keras.models.load_model(model_file)

现在在 tensorflow 中导出的图只显示所需的层,冻结的图生成一个较小的 .pb 文件。

然而,另一个问题仍然存在,即使使用基础模型的单层并添加一个密集层,编译器仍然说

Not enough on-device memory to run model.

但这是一个不同的问题,没有直接在这个问题中提出。