tensorflow - 如何使用 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 ”,可以在这里找到。
解决方案
您可以使用两种方法:
- 文件“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 中加载和自定义恢复模型的教程。
推荐阅读
- css - 如何设计答案框/添加新主题框
- python-3.x - 文件夹中文件的多处理队列
- d3.js - 如何在d3中减小旭日形内圈的大小
- ios - 在 CoreNFC 中使用 sendMiFareCommand 编写 NDEF 消息
- python - 如何使用熊猫创建像索引这样的分层目录?
- email - 当 namecheap 是您的域名提供商时,使用 mailgun 创建电子邮件重定向
- node.js - axios 多部分请求失败
- u-boot - U-boot 'nand markbad' 没有效果
- amazon-web-services - 为 DynamoDB 中的时间序列数据选择复合键
- excel - Excel 操作列