为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2023-04-18 10:46:55
我需要使用 Keras(keras.applications.VGG16)中的预训练模型作为从它的第一层创建另一个模型(用于进行迁移学习)的基线。最终目标是冻结并导出模型,以便在带有 AIY 视觉套件的树莓派上部署。我尝试了以下常见方法:model_base = keras.applications.VGG16(input_tensor=inputs)x = model_base.get_layer(backbone_layer).outputx = 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 循环中)失败。或者我还有什么其他选择可以通过仅保留第一层然后将其连接到其他一些自定义层来使用预训练模型作为基线。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

最简单的方法是在 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'])



查看完整回答
反对 回复 2023-04-18
?
白衣非少年

TA贡献1155条经验 获得超0个赞

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


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


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作为输出。


查看完整回答
反对 回复 2023-04-18
?
Qyouu

TA贡献1786条经验 获得超11个赞

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


model.save(model_file)

del model

keras.backend.clear_session()

model = keras.models.load_model(model_file)

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


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


设备内存不足,无法运行模型。


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


查看完整回答
反对 回复 2023-04-18
  • 3 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信