如何保持查找表初始化以进行预测(而不仅仅是训练)?

Posted

技术标签:

【中文标题】如何保持查找表初始化以进行预测(而不仅仅是训练)?【英文标题】:How to keep lookup tables initialized for prediction (and not just training)? 【发布时间】:2017-10-29 09:14:27 【问题描述】:

我使用训练数据(作为输入)从tf.contrib.lookup 创建一个查找表。然后,我将每个输入都通过该查找表,然后再通过我的模型。

这适用于训练,但是当涉及到同一模型的在线预测时,它会引发错误:

表未初始化

我正在使用SavedModel 来保存模型。我从这个保存的模型中运行预测。

如何初始化此表以使其保持初始化状态?或者有没有更好的方法来保存模型以便始终初始化表?

【问题讨论】:

【参考方案1】:

当您使用 tf.saved_model.builder.SavedModelBuilder.add_meta_graph 将元图添加到 SavedModel 捆绑包时,您可以使用 main_oplegacy_init_op kwarg 指定“初始化”操作。您可以使用单个操作,也可以使用tf.group 将多个操作组合在一起(如果您需要多个操作)。

请注意,在 Cloud ML Engine 中,您必须使用 legacy_init_op。但是在未来runtime_versions 你将能够使用main_op (IIRC,以runtime_version == 1.2开头)

saved_model 模块提供了一个内置的tf.saved_model.main_op.main_op 以将常见的初始化操作封装在单个操作中(局部变量初始化和表初始化)。

总之,代码应该是这样的(改编自this example):

  exporter = tf.saved_model.builder.SavedModelBuilder(
      os.path.join(job_dir, 'export', name))

  # signature_def gets constructed here

  with tf.Session(graph=prediction_graph) as session:
    # Need to be initialized before saved variables are restored
    session.run([tf.local_variables_initializer(), tf.tables_initializer()])
    # Restore the value of the saved variables
    saver.restore(session, latest)
    exporter.add_meta_graph_and_variables(
        session,
        tags=[tf.saved_model.tag_constants.SERVING],
        signature_def_map=
            tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_def
        ,
        # Relevant change to the linked example is here!
        legacy_init_op=tf.saved_model.main_op.main_op()
    )

注意:如果您使用高级库(例如tf.estimator),这应该是默认设置,如果您需要指定其他初始化操作,您可以将它们指定为您传递的tf.train.Scaffold 对象的一部分到你的model_fn中的tf.estimator.EstimatorSpec

【讨论】:

If you are using the high level libraries (such as tf.estimator) this should be the default 是什么意思?如何在构建估算器时传递我的自定义 init_op【参考方案2】:

我认为你最好使用tf.tables_initializer() 作为legacy_init_op

tf.saved_model.main_op.main_op() 除了表初始化之外,还添加了本地和全局初始化操作。 当您加载保存的模型并运行 legacy_init_op 时,它会重置您的变量,这不是您想要的。

【讨论】:

我认为这应该是正确的答案。 "tf.saved_model.main_op.main_op" 似乎效果不佳,并且使结果随机

以上是关于如何保持查找表初始化以进行预测(而不仅仅是训练)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LSTM 单元训练 RNN 以进行时间序列预测

当图像大小不同时,如何格式化图像数据以进行训练/预测?

TF |训练完成后如何从 CNN 进行预测

Keras LSTM:如何预测超越验证与预测?

SVM模型进行分类预测时的参数调整技巧

如何在 Android Studio 中使用预训练的 .model 文件进行预测?