首页 > 解决方案 > 如何使用 freeze_interference_graph.pb 创建 Keras 模型?

问题描述

我想使用预训练模型并在其末尾添加一个分割头,但问题是我只有“ frozen_inference_graph.pb ”。这些是我从模型中获得的文件:

在此处输入图像描述

我尝试了几种方法:

1. 将预训练的模型加载到 Keras 模型中: 我拥有的文件似乎是不可能的。它只是给了我一个 AutoTrackable 对象而不是一个模型。

2. 访问冻结模型的张量对象并使用张量制作模型: 我发现了如何访问张量,但无法使用张量对象制作 Keras 模型。

with self.graph.as_default():
    graph = tf.import_graph_def(graph_def, name='')

graph = tf.compat.v1.import_graph_def(graph_def)
tf.compat.v1.Graph.as_default(graph)
self.sess = tf.Session(graph=self.graph)
self.tensors = [tensor for op in tf.compat.v1.get_default_graph().get_operations() for tensor in op.values()]

在这里我可以得到张量,但我不能在模型中使用张量:

model = tf.keras.models.Model(inputs=self.tensors[0], outputs=self.tensors[-1])

有没有办法将此冻结图转换为 Keras 模型?或者,如果有另一种方法可以训练模型,我会很高兴知道。

PS 预训练模型是“ ssd_mobilenet_v3_small_coco_2020_01_14 ”,可以在这里找到。

标签: tensorflowkerasdeep-learningimage-segmentationdeeplab

解决方案


您可以使用两种方法:

  1. 文件“frozen_inference_graph.pb”包含有关权重和模型架构的所有必要信息。使用以下代码片段读取模型并添加新层:a
 customModel = tf.keras.models.load_model('savedModel')  
 # savedModel is the folder with .pb data

 pretrainedOutput = customModel.layers[-1].output 
 newOutput = tf.keras.layers.Dense(2)(pretrainedOutput) # change layer as needed

 new_model = tf.keras.Model(inputs=customModel.inputs, outputs=[newOutput]) 
 # create a new model with input of old model and new output tensors

其中“savedModel”是包含“frozen_inference_graph.pb”和其他元数据的文件夹的名称。请参阅TFguide中有关使用 .pb 文件和微调自定义模型的详细信息。

  1. 尝试使用带有模型架构的.meta文件和.ckpt来恢复 TF 1.x 中的权重:
with tf.Session() as sess:
  new_saver = tf.train.import_meta_graph('my_test_model-1000.meta')
  new_saver.restore(sess, tf.train.latest_checkpoint('./'))

请参阅有关如何在 TF 1.x 中加载和自定义恢复模型的教程。


推荐阅读