问题描述
我想使用预先训练的模型并在其末尾添加一个细分头,但是问题是我只有' 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模型? 或者,如果还有其他方法可以训练模型,我将很高兴知道。
P.S。预先训练的模型是“ ssd_mobilenet_v3_small_coco_2020_01_14 ”,可以在Here上找到。
解决方法
您可以使用两种方法:
- 文件'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文件和微调自定义模型的详细信息。
- 尝试使用具有模型体系结构的 .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。