如何在tensorflow中组合variables.data和saved_model.pb

时间:2017-11-27 21:53:06

标签: tensorflow keras tensorflow-serving quantization

我是tensorflow和keras的新手。 我使用keras训练CNN进行句子分类,并使用以下代码导出模型

K.set_learning_phase(0)
config = model.get_config()
weights = model.get_weights()

new_model = Sequential.from_config(config)
new_model.set_weights(weights)

builder = saved_model_builder.SavedModelBuilder(export_path)
signature = predict_signature_def(
    inputs={'input': new_model.inputs[0]},
    outputs={'prob': new_model.outputs[0]})


with K.get_session() as sess:

    builder.add_meta_graph_and_variables(
        sess=sess,
        tags=[tag_constants.SERVING],
        clear_devices = True,
        signature_def_map={
            signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature}
    )
builder.save()

我在变量文件夹和saved_model.pb中获得了变量.data-00000-of-00001和variables.index。

我希望在部署预测之前将这些文件合并到一个文件中。 最后我想量化模型,因为变量文件大小真的很大,我想在使用tensorflow的量化功能之前,我需要将我的模型冻结在pb文件中。 请帮忙

2 个答案:

答案 0 :(得分:0)

您可以使用freeze_graph.py工具将文件合并到一个文件中。

这将输出一个包含所有权重和体系结构的GraphDef文件。

你会这样使用它:

bazel build tensorflow/python/tools:freeze_graph && \
bazel-bin/tensorflow/python/tools/freeze_graph \
--input_graph=some_graph_def.pb \
--input_checkpoint=model.ckpt-8361242 \
--output_graph=/tmp/frozen_graph.pb --output_node_names=softmax

input_graphsaved_model.pb文件的位置。

input_checkpoint文件夹中的variables是您的变量,它们可能如下所示:

/tmp/model/model-chkpt-8361242.data-00000-of-00002
/tmp/model/model-chkpt-8361242.data-00001-of-00002
/tmp/model/model-chkpt-8361242.index
/tmp/model/model-chkpt-8361242.meta

请注意,在这种情况下,您将模型检查点称为model-chkpt-8361242

使用freeze_graph.py工具时,您可以获取每个文件的前缀。

答案 1 :(得分:0)

您打算如何为您的模特服务? TensorFlow Serving本身支持SavedModelFormat - 无需执行freeze_graph.py步骤。

如果您仍想手动组合图形和变量(并使用freeze_graph.py),您可能需要使用旧的ExportModel格式,如上面Clarence所示。

此外,您也可能希望此时切换到Estimator API。

以下是使用以上所有内容的一些示例:https://github.com/pipelineai/pipeline