Python TensorFlow:将py_func保存到.pb文件

Python TensorFlow:将py_func保存到.pb文件,python,tensorflow,Python,Tensorflow,我尝试构建一个tensorflow模型——在这里,我使用tf.py_func在普通python代码中创建代码的一部分。问题是,当我将模型保存到.pb文件时,.pb文件本身非常小,并且不包括py_func:0张量。当我尝试从.pb文件加载并运行模型时,出现以下错误:get ValueError:未找到回调pyfunc_0 当我不保存并加载为.pb文件时,它就可以工作了 有人能帮忙吗。这对我来说非常重要,给了我几个不眠之夜 model_version = "465555564" tensorboar

我尝试构建一个tensorflow模型——在这里,我使用tf.py_func在普通python代码中创建代码的一部分。问题是,当我将模型保存到.pb文件时,.pb文件本身非常小,并且不包括py_func:0张量。当我尝试从.pb文件加载并运行模型时,出现以下错误:get ValueError:未找到回调pyfunc_0

当我不保存并加载为.pb文件时,它就可以工作了

有人能帮忙吗。这对我来说非常重要,给了我几个不眠之夜

model_version = "465555564"
tensorboard = TensorBoard(log_dir='./logs', histogram_freq = 0, write_graph = True, write_images = False)

sess = tf.Session()
K.set_session(sess)
K.set_learning_phase(0)

def my_func(x):
    some_function

input = tf.placeholder(tf.float32)
y = tf.py_func(my_func, [input], tf.float32)

prediction_signature = tf.saved_model.signature_def_utils.predict_signature_def({"inputs": input}, {"prediction": y})
builder = saved_model_builder.SavedModelBuilder('./'+model_version)
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
builder.add_meta_graph_and_variables(
      sess, [tag_constants.SERVING],
      signature_def_map={
           signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:prediction_signature,
      },
      legacy_init_op=legacy_init_op)

builder.save()

有一种方法可以使用
TF.py_func
保存TF模型,但是您必须使用
SavedModel
而不使用

TF有两个模型保存级别:检查点和
SavedModels
。有关更多详细信息,请参见,但请在此处引用:

  • 检查点包含TensorFlow模型中(某些)变量的值。它是由一个。要使用检查点,您需要有一个兼容的TensorFlow
    图形
    ,其
    变量
    与检查点中的
    变量
    具有相同的名称
  • 更全面:它包含一组
    Graph
    s(,实际上是保存集合等),以及一个与这些
    Graph
    s兼容的检查点,以及运行模型所需的任何资产文件(例如词汇表文件)。对于它包含的每个
    元图
    ,它还存储一组签名。签名定义(命名)输入和输出张量
tf.py_func
op无法与
SavedModel
(上有说明)一起保存,这正是您在此处尝试执行的操作。这是有充分理由的
SavedModel
s应该完全独立于原始代码,可以用任何其他可以反序列化它的语言加载。这允许模型加载的东西,这可能是写在C++或类似的东西。问题是它无法序列化任意Python代码,因此
py_func
是不可能的

您可以通过使用检查点来解决这个问题,只要您不介意使用Python。您将无法获得
SavedModel
s提供的独立性。您可以在使用
tf.train.Saver
进行培训后保存一个检查点,然后在新的
会话中重新构建整个图形并使用该
Saver
加载它。甚至还有一种在ML引擎中使用该代码的方法,该引擎过去专门用于
SavedModel
s。您可以使用来回避对
SavedModel
的需要


有关在中保存/恢复模型的详细信息。

这是其局限性之一。“函数体(即func)将不会在GraphDef中序列化”我是否可以绕过此问题?我要做的是加载一个包含“Random Forrest Model”的.pickle文件。我想在TensorFlow内部运行的模型您可以尝试使用autograph,TensorFlow中有一个随机林的实现,请参阅。注意:这是当前位于
tf.contrib
下的内容,其中。请参阅RFC以了解已接受的张索森林计划。