如何使用Frozen_interference_graph.pb创建Keras模型?

问题描述

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

enter image description here

我尝试了几种方法

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模型? 或者,如果还有其他方法可以训练模型,我将很高兴知道。

P.S。预先训练的模型是“ ssd_mobilenet_v3_small_coco_2020_01_14 ”,可以在Here上找到。

解决方法

您可以使用两种方法:

  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中加载和自定义恢复的模型,请参考tutorial

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...