【问题标题】:Error in saving and using model of TensorForestEstimator for Android保存和使用TensorForestEstimator for Android模型时出错
【发布时间】:2017-04-12 11:32:21
【问题描述】:

我使用在 tensorflow 中实现的随机森林估计器来预测文本是否为英文。我使用以下代码(train_input_fn 函数返回特征和类标签)保存了我的模型(具有 2k 个样本和 2 个类标签 0/1(非英语/英语)的数据集):

model_path='test/'
TensorForestEstimator(params, model_dir='model/')
estimator.fit(input_fn=train_input_fn, max_steps=1)

运行上述代码后,graph.pbtxt 和 checkpoints 保存在模型文件夹中。现在我想在 Android 上使用它。我有两个问题:

  1. 作为第一步,我需要将图形和检查点冻结为 .pb 文件,以便在 Android 上使用它。我尝试了 freeze_graph(我在这里使用了代码:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py)。当我在我的模式下调用 freeze_graph 时,出现以下错误并且代码无法创建最终的 .pb 图:

    文件“/Users/XXXXXXX/freeze_graph.py”,第 105 行,在 freeze_graph _ = tf.import_graph_def(input_graph_def, name="") 文件“/anaconda/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/importer.py”,第 258 行,在 import_graph_def op_def = op_dict[node.op] KeyError: u'CountExtremelyRandomStats'

这就是我所说的 freeze_graph:

def save_model_android():
    checkpoint_state_name = "model.ckpt-1"
    input_graph_name = "graph.pbtxt"
    output_graph_name = "output_graph.pb"
    checkpoint_path = os.path.join(model_path, checkpoint_state_name)

    input_graph_path = os.path.join(model_path, input_graph_name)
    input_saver_def_path = None
    input_binary = False
    output_node_names = "output"
    restore_op_name = "save/restore_all"
    filename_tensor_name = "save/Const:0"
    output_graph_path = os.path.join(model_path, output_graph_name)
    clear_devices = True

    freeze_graph.freeze_graph(input_graph_path, input_saver_def_path,
                              input_binary, checkpoint_path,
                              output_node_names, restore_op_name,
                              filename_tensor_name, output_graph_path,
                              clear_devices, "")

我还尝试在“tf.contrib.learn.datasets.load_iris”中冻结 iris 数据集。我犯了同样的错误。所以我认为它与数据集无关。

  1. 作为第二步,我需要使用手机上的 .pb 文件来预测文本。我通过谷歌找到了相机演示示例,其中包含大量代码。我想知道是否有分步教程如何通过传递特征向量并获取类标签来在 Android 上使用 Tensorflow 模型。

谢谢,提前!

更新

通过使用最新版本的tensorflow(0.12),问题解决了。但是,现在的问题是我应该传递给 output_node_names 什么???如何获取图中的输出节点?

【问题讨论】:

    标签: android tensorflow skflow


    【解决方案1】:

    CountExtremelyRandomStats 是 TensorForest 的自定义操作之一,存在于 tensorflow/contrib 中。正如所指出的,TF 在某些时候默认切换到包含 contrib ops。我认为在以前的版本中没有一种简单的方法可以将 contrib 自定义操作包含在全局注册表中,因为 TensorForest 使用构建 .so 文件的方法,该文件包含在运行时加载的数据文件中(一种方法这是创建 TensorForest 时的标准,但可能不再是)。因此,没有容易包含的 python 构建规则可以正确链接到 C++ 自定义操作中。您可以尝试在构建规则中包含 tensorflow/contrib/tensor_forest:ops_lib 作为一个 dep,但我认为它不会起作用。

    无论如何,您都可以尝试安装 tensorflow 的夜间版本。替代方案包括修改 tensorforest 自定义操作的构建方式,这非常讨厌。

    【讨论】:

    • 谢谢,吉尔伯特!我使用的是张量流 0.11。我今天将 tensorflow 升级到 0.12 版。现在我收到了同样的错误,但我猜是在另一个操作上。 KeyError:u'TreePredictions'。所以你的意思是它是张量流中的一个错误?因为我只是将 tensorflow 的一部分传递给其他部分。
    • 似乎问题在于 TensorForestEstimator 中的保存类型:警告:tensorflow:TensorFlow 的 V1 检查点格式已被弃用。 WARNING:tensorflow:考虑切换到更高效的 V2 格式:WARNING:tensorflow:tf.train.Saver(write_version=tf.train.SaverDef.V2)WARNING:tensorflow:now 默认开启。我使用以下内容保存模型:classifier = tf.contrib.learn.TensorForestEstimator(hparams, model_dir='test/')。我现在该怎么办?
    • 不要担心有关 Saver 版本的警告,切换到新格式将在后台发生。这应该不是问题,除非您尝试从升级 TF 之前加载检查点(这就是您的意思吗?)。
    • 让我尝试重现 TreePredictions 错误。 contrib (TensorForest) 中的东西没有得到严格支持,所以我们还没有对使用 freeze_graph 进行任何测试。
    • 我想到的另一件事可能更简单:许多 contrib 库似乎在模块范围内加载他们的自定义操作,这可能是 Alexandre 建议显式导入 tensorforest 的原因。但是,Tensorforest 不会在模块范围内加载它们,它们隐藏在 Load() 函数后面。所以也许在调用 freeze_graph 之前尝试调用 training_ops.Load() 和 inference_ops.Load()(在 tensorflow/contrib/tensor_forest/python/ops 中找到)。
    【解决方案2】:

    Re (1) 看起来您是在无法访问 contrib 操作的 tensorflow 构建上运行 freeze_graph。也许在调用 freeze_graph 之前尝试显式导入 tensorforest?

    关于 (2) 我不知道更简单的例子。

    【讨论】:

    • 感谢您的回复。我没明白你的意思。请您通过一个例子来描述更多吗?非常感谢!
    • 一个具体的例子?
    • "在调用 freeze_graph 之前尝试显式导入 tensorforest" -> 在 save_model_android 函数中应该怎么做?
    • 将张量流导入为 tf; tf.contrib.tensor_forest.python.tensor_forest,或类似的东西。
    • 抱歉,您遇到了问题!如果您可以通过 google.com 的 给我发送电子邮件,我想看看您是否可以共享您的 GraphDef 和检查点,以便我可以调试问题。在教程前面,您可能会发现 petewarden.com/2016/09/27/tensorflow-for-mobile-poets 很有用(尽管它是针对 iOS 的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多