将培训检查点导出到生产 - 需要白痴指南

时间:2018-06-18 19:23:17

标签: tensorflow object-detection

我有一个正确的'母马 我在尝试将培训信息发送到可以部署到生产服务器的状态时遇到了实际困难 我跟着this tutorial(这对我来说非常精细和完美)。我将检查点导出到冻结推理图并使用测试脚本查看它是否有效really quite well。我在某处读到这些冻结推理图对生产无益,需要将其导出为'SavedModel'。 我花了几个小时寻找解决方案/指南但是已经找到了很多不同的答案 - 有些已成功导出到'1 / saved-model.pb 1 / Variables'模型文件夹结构。
兴奋,我得到了一个数字海洋账户,预装了一个带Docker的Ubuntu VM,并设置了以下容器:
   - Bitnami/tensorflow-serving
   - Bitnami/tensorflow-inception

然后我用docker-compose启动它们,启动一些共享目录等。通过示例模型(inception-v3),我可以在传递jpg时使这个系统运行良好。
当我尝试为我的导出模型提供服务时出现问题我遇到了很多错误,我真的不理解,无法找到在线解决方案。当试图从docker cli运行它时,我会得到一些(我怀疑)network errors。 当我尝试设置NodeJS服务器时,使用包tensorflow-serving-node-client(这可能是我用来传递来自Firebase的请求的一些变体)回来抱怨'tensors' and 'signatures'

我通常擅长解决问题,但不幸的是,由于缺乏睡眠,时间和阅读能力特别好,我真的很想做到这一点。我知道我的基本知识看起来不完整,这是我解决问题的方法。

我非常怀疑我没有正确导出检查点,因此难以提供检查点,但是我所搜索过的所有YouTube视频和博客文章(一周以上)只能解释直到设置培训或从您导出模型并希望提供服务的角度。如果我正确地理解它,那么在解释中间位时似乎存在某种市场。我确实关注this official guide,但是当它全部导出时,一切都是空的~4kb文件,这显然是不对的。

是否有人能够指出我在哪里可以找到简明可靠的指南?我可以停止将头撞在墙上的那一点非常棒。我甚至问了一些“数据科学家”在工作,他们只是告诉我他们从来没有听说过它,只是使用R和Excel ......

发送帮助。

提前致谢,
卢克

PS。抱歉长度。我确信它会被某种模式剔除 - 我有点冗长的解释器。

1 个答案:

答案 0 :(得分:1)

我没有必要认为冻结的图表不适合服务,至少我不明白它为什么会这样,但那可能就是我。我会尝试帮助,但不能做任何承诺。

1)冻结图基本上是一个变换的savedModel,所有权重都设置为常量而不是变量,因此无法处理。这意味着你应该在某个地方有一个savedModel。

2)如果你不这样做,我们先将冻结的图形加载到会话中,然后再转换它。

def load_frozen_model(path_to_model):
    path_to_model = check_path(path_to_model, mode="frozen")
    with tf.gfile.GFile(path_to_model, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())

    with tf.Session() as sess:
        tf.import_graph_def(graph_def, name="")
        return sess

builder = tf.saved_model.builder.SavedModelBuilder(saved_model_path="non existing 
                                                                     folder")
session = load_frozen_model("path/to/something.pb")

# create tensorboard logs, run with $ tensorboard --log_dir path_to_log_folder
# check for the names of the input and output you need.
tf.summary.FileWriter(path_to_existing_folder, session.graph)

input_tensor = session.graph.get_tensor_by_name("name_you_need:0")
output_tensor = session.graph.get_tensor_by_name("name_you_need:0")
input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor )
output_tensor_info = tf.saved_model.utils.build_tensor_info(output_tensor )
signature = tf.saved_model.signature_def_utils.build_signature_def(
             inputs={'input_image': input_tensor_info},
             outputs={'final_result': output_tensor_info},
             method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)

# save as SavedModel
builder.add_meta_graph_and_variables(session,
                                         [tf.saved_model.tag_constants.SERVING],
                                         signature_def_map={'serving_default': 
                                                            signature})
builder.save()

3)您可以通过执行以下操作加载此已保存的模型:

def load_saved_model(path_to_model):
    with tf.Session() as sess:
        tf.saved_model.loader.load(sess, [tag_constants.SERVING], path_to_model)
        return sess

4)我不确定这个错误“详细信息:'在签名中找不到输入张量别名:图像。输入预计在集合{inputs}中。” “应该抱怨,但可能是你没有正确定义签名,或者你没有正确指定输入。

如果我没有提供您正在寻找的答案,那么我很抱歉,但我认为这可能是您的问题。我对这些http错误一无所知,也没有真正用服务器为你的模型服务,我通常倾向于使用其他东西。 如果你遇到错误,我们可以一起调试,我只是编写了这个代码,没有在你的模型上测试它。