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

2024-06-30 15:53:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用训练数据(作为输入)从^{}创建一个查找表。然后,在将每个输入传递到我的模型之前,我将其传递到查找表中。

这适用于训练,但当从同一模型进行在线预测时,会产生错误:

Table not initialized

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

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


Tags: 数据方法模型状态错误tablenotsavedmodel
2条回答

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

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

使用main_oplegacy_init_opkwarg将元图添加到具有^{}的SavedModel包时,可以指定“初始化”操作。如果需要多个操作,可以使用单个操作,也可以使用tf.group将多个操作组合在一起。

注意,在Cloud ML引擎中,必须使用legacy_init_op。但是在未来的runtime_version中,您将能够使用main_op (IIRC,从runtime_version == 1.2开始)

saved_model模块提供了一个内置的^{},用于在单个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()
    )

注意:如果您使用的是高级库(如^{}),这应该是默认的,如果需要指定其他初始化操作,可以将它们指定为传递给模型中^{}^{}对象的一部分fn。

相关问题 更多 >