我希望将训练有素的模型部署到ml-engine。我可以在本地运行我的代码,例如:
with tf.Session() as sess:
sess.run([tf.global_variables_initializer(), tf.tables_initializer()])
example_result = sess.run(
my_model,
feed_dict=###snip###
)
我一直在尝试导出:
export_builder.add_meta_graph_and_variables(
sess,
[tf.saved_model.tag_constants.SERVING],
signature_def_map={
tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig
})
然后我可以将其部署到ml-engine。但是,当我调用模型时,由于未初始化表,因此会出现错误。
如何在自动/默认情况下初始化表的地方部署模型?
我尝试过的事情:
tf.tables_initializer()
中的任何操作之前将my_model
添加为依赖项这在第一次时有效,但是在每次后续调用中均失败,并显示一条错误消息,告诉我该表已经初始化
tf.tables_initializer()
作为legacy_init_op
参数传递给add_meta_graph_and_variables
方法。这完全无法部署到ml-engine并显示错误消息
创建版本失败。检测到错误的模型,并显示以下错误:“无法加载 模型:需要一个类似字节的对象,而不是'str'(错误代码:0)“
tf.tables_initializer()
或tf.saved_model.main_op.main_op()
作为main_op
参数传递给add_meta_graph_and_variables
方法。在每种情况下,它仍然无法通过与(2.)中相同的错误消息来部署模型:
创建版本失败。检测到错误的模型,并显示以下错误:“无法加载 模型:需要一个类似字节的对象,而不是'str'(错误代码:0)“
答案 0 :(得分:1)
我们必须将表初始化程序op作为assets_collection
传递,而且至关重要的是,我们必须在对add_meta_graph_and_variables
的调用中包含init_op = tf.tables_initializer()
with tf.Session() as sess:
sess.run([tf.global_variables_initializer(), init_op])
example_result = sess.run(
my_model,
feed_dict=###snip###
)
:
export_builder.add_meta_graph_and_variables(
sess,
[tf.saved_model.tag_constants.SERVING],
main_op = init_op,
assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS),
signature_def_map={
tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig
}
)
然后
{{1}}
作为(可能更简单)的替代方法,我们可以使用simple_save
方法来保存模型