Tensorflow:如何保存经过训练的模型的差异

时间:2018-06-29 18:26:59

标签: python tensorflow tensorflow-serving

我注意到在Python中,存在几种保存训练过的模型的方法 但是我看不到它们之间的真正区别。

  1. 检查点

    saver = tf.train.Saver()
    saver.save(session, output_path)
    
  2. 冻结

    from tensorflow.python.framework import graph_util
    
    input_graph_def = graph.as_graph_def()
    output_graph_def = graph_util.convert_variables_to_constants(
        session, input_graph_def, output_nodes_names)
    
    with tf.gfile.GFile(output_graph, "wb") as output_graph_file:
        output_graph_file.write(output_graph_def.SerializeToString())
    
  3. SavedModelBuilder

    builder = tf.saved_model.builder.SavedModelBuilder(output_path)
    builder.add_meta_graph_and_variables(
        session,
        [tf.saved_model.tag_constants.SERVING],
        clear_devices=True)
    
    builder.save()
    

让我们考虑不同的场景:评估/推断,微调,服务API,导出到其他框架。 为每种情况保存模型的最佳方法是什么?是否有关于何时使用一种方法的规则?

谢谢

1 个答案:

答案 0 :(得分:1)

这不是一个详尽的答案,但是对于现代(2018年中)的TensorFlow,您可能只需要Checkpoints和SavedModels。

中所指出

https://www.tensorflow.org/get_started/checkpoints

|

“冻结”在很大程度上被折叠并由SavedModel取代。

在您的训练代码中,并且您仍然想保留继续训练/微调的能力时,检查点是必经之路,因为所有相关的代码/状态不仅要训练,而且还要监视是否保持训练在检查点和您的代码之间。

当您移至“服务”端(即消费)时,您将添加使用该模型所需的所有元数据,剔除不需要的训练元素,然后转到SavedModel。

我个人还没有尝试将TensorFlow中的导出到其他框架,只是将其导入其中,所以我无法就哪种情况最合适提出好意见。