【问题标题】:Tensorflow Scikit Flow get GraphDef for Android (save *.pb file)Tensorflow Scikit Flow 获取 GraphDef for Android(保存 *.pb 文件)
【发布时间】:2017-02-02 14:10:17
【问题描述】:

我想在 Android 应用中使用我的 Tensorflow 算法。 Tensorflow Android 示例首先下载包含模型定义和权重的 GraphDef(在 *.pb 文件中)。现在这应该来自我的 Scikit Flow 算法(Tensorflow 的一部分)。

乍一看,你只需要说classifier.save('model/')似乎很容易,但保存到该文件夹​​的文件不是*.ckpt、*.def,当然也不是*.pb。相反,您必须处理 *.pbtxt 和检查点(没有结尾)文件。

我被困在那里已经有一段时间了。这是一个导出内容的代码示例:

#imports
import tensorflow as tf
import tensorflow.contrib.learn as skflow
import tensorflow.contrib.learn.python.learn as learn
from sklearn import datasets, metrics

#skflow example
iris = datasets.load_iris()
feature_columns = learn.infer_real_valued_columns_from_input(iris.data)
classifier = learn.LinearClassifier(n_classes=3, feature_columns=feature_columns,model_dir="modeltest")
classifier.fit(iris.data, iris.target, steps=200, batch_size=32)
iris_predictions = list(classifier.predict(iris.data, as_iterable=True))
score = metrics.accuracy_score(iris.target, iris_predictions)
print("Accuracy: %f" % score)

你得到的文件是:

  • 检查点
  • graph.pbtxt
  • model.ckpt-1.meta
  • model.ckpt-1-00000-of-00001
  • model.ckpt-200.meta
  • model.ckpt-200-00000-of-00001

我发现的许多可能的解决方法都需要将 GraphDef 放在一个变量中(不知道如何使用 Scikit Flow)。或者似乎不需要使用 Scikit Flow 的 Tensorflow 会话。

【问题讨论】:

  • 你找到解决办法了吗?
  • 我决定使用 Scikit Flow 进行实验(我的 NN 需要多少层等),然后用纯 tensorflow 重新创建了模型。然后,我通过创建第二个模型来避免整个 freeze_graph bazel 的东西,将已经训练的权重作为常量(切换到 iOS,但对于 Android 可能相同)。这不是真正的建议,只是我选择的路径

标签: scikit-learn tensorflow tensorflow-serving


【解决方案1】:

要保存为 pb 文件,您需要从构建的图形中提取 graph_def。你可以这样做--

from tensorflow.python.framework import tensor_shape, graph_util
from tensorflow.python.platform import gfile
sess = tf.Session()
final_tensor_name = 'results:0'     #Replace final_tensor_name with name of the final tensor in your graph
#########Build your graph and train########
## Your tensorflow code to build the graph
###########################################

outpt_filename = 'output_graph.pb'
output_graph_def = sess.graph.as_graph_def()
with gfile.FastGFile(outpt_filename, 'wb') as f:
  f.write(output_graph_def.SerializeToString())

如果您想将训练后的变量转换为常量(以避免使用 ckpt 文件加载权重),您可以使用:

output_graph_def = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), [final_tensor_name])

希望这会有所帮助!

【讨论】:

  • 说“名称'FLAGS'未定义”。如果我将目标路径改为 *.pb 文件,它似乎可以工作。另外我不知道您所说的 [network_prefix+final_tensor_name] 是什么意思。看来我可以把输出占位符放在那里(因为字符串似乎需要一个名字)
  • @CodingYourLife:是的。我编辑了更改。将 final_tensor_name 替换为张量或张量的名称(输出节点),它将正确导出输出图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多