我需要使用 Keras(keras.applications.VGG16)中的预训练模型作为从它的第一层创建另一个模型(用于进行迁移学习)的基线。最终目标是冻结并导出模型,以便在带有 AIY 视觉套件的树莓派上部署。
我尝试了以下常见方法:
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 编译器编译时回报:
设备内存不足,无法运行模型
这很奇怪,因为生成的模型(.pb 文件和层数)比其他可以正确导入的手动定义的模型更小,在分析 tensorboard 并将 .pb 文件导出为文本后,我发现原始模型正在也导出(所有图层,甚至是未使用和使用 pop() 删除的图层),而不仅仅是新图层
(在 tensorboard 中看到有 2 个并行模型,右边是所需的模型,但原始模型的原始层仍显示在左侧,原始模型的那部分也存在于导出的 .pb 文件中)
我的问题是我怎样才能明确地从 keras.applications.VGG16 模型中删除未使用的层并只保留第一层 + 新的自定义层?使用 pop() 没有用,也尝试了 del 层(在 for 循环中)失败。
或者我还有什么其他选择可以通过仅保留第一层然后将其连接到其他一些自定义层来使用预训练模型作为基线。
侃侃无极
白衣非少年
Qyouu
相关分类