python - 在 tensorflow 中导入图形时使用新操作

标签 python c++ tensorflow

我是 TensorFlow 的新手。我正在尝试导入带有检查点文件的训练有素的 TensorFlow 网络。我正在使用的网络有一个自定义操作,当我在 Python 中使用它时它工作正常。但是,我必须卡住图形,因为我必须使用 C++ API。我正在使用 TensorFlow 基本目录中的以下命令调用 freeze_graph:

bazel-bin/tensorflow/python/tools/freeze_graph --input_graph=<local path>/data/graph_vgg.pb --input_checkpoint=<local path>/data/VGGnet_fast_rcnn_iter_70000.ckpt --output_node_names="cls_prob,bbox_pred" --output_graph=<local path>/graph_frozen.pb

但是,当我试图卡住图形时出现以下错误。

Traceback (most recent call last):
  File "<local path>/tensorflow/bazel-bin/tensorflow/python/tools/freeze_graph.runfiles/org_tensorflow/tensorflow/python/tools/freeze_graph.py", line 202, in <module>
    app.run(main=main, argv=[sys.argv[0]] + unparsed)
  File "<local path>/tensorflow/bazel-bin/tensorflow/python/tools/freeze_graph.runfiles/org_tensorflow/tensorflow/python/platform/app.py", line 44, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "<local path>/tensorflow/bazel-bin/tensorflow/python/tools/freeze_graph.runfiles/org_tensorflow/tensorflow/python/tools/freeze_graph.py", line 134, in main
    FLAGS.variable_names_blacklist)
  File "<local path>/tensorflow/bazel-bin/tensorflow/python/tools/freeze_graph.runfiles/org_tensorflow/tensorflow/python/tools/freeze_graph.py", line 99, in freeze_graph
    _ = importer.import_graph_def(input_graph_def, name="")
  File "<local path>/tensorflow/bazel-bin/tensorflow/python/tools/freeze_graph.runfiles/org_tensorflow/tensorflow/python/framework/importer.py", line 260, in import_graph_def
    raise ValueError('No op named %s in defined operations.' % node.op)
ValueError: No op named RoiPool in defined operations.

输入图有一个节点,其操作类型为 RoiPool,TensorFlow 无法识别。我调查了引发此错误的代码,看起来操作未在 TensorFlow 中注册。我有内置的 .so 文件。我应该把它复制到某个地方吗?我在网上找不到类似的东西。任何帮助或指示都会很棒。我在这个问题上花了很多时间。该代码在 python 中运行良好,使用 op 的层位于项目目录中。请帮助我了解我需要做什么才能使其正常工作。

编辑:这是 code of custom op在网络中使用。

最佳答案

我不熟悉特定的 RoiPooling 实现,但我通常设置需要卡住的自定义操作的方式是 roi_pooling_op.cc 和相关的 python 文件(定义梯度并导入 *.so)都位于在//tensorflow/user_ops 中。

//tensorflow/user_ops目录下的BUILD文件应该有

tf_custom_op_library(
    name = "roi_pooling_op.so",
    srcs = ["roipooling_op.cc"],
)

py_library(
    name = "roi_pooling_op_py",
    srcs = ["roi_pooling.py"],
    data = [":roi_pooling_op.so"],
    srcs_version = "PY2AND3",
)

* Tensorflow 文档中未提及 data = [":roi_pooling_op.so"],但这样您就不必深入了解本地 bazel-bin 目录,而是可以使用tf.resource_loader.get_path_to_datafile导入*.so

_roi_pooling_module = tf.load_op_library(tf.resource_loader.get_path_to_datafile("roi_pooling_op.so"))
roi_pool = _roi_pooling_module.roi_pool
roi_pool_grad = _roi_pooling_module.roi_pool_grad

@ops.RegisterGradient("RoiPool")
def _roi_pool_grad(op, grad, _):
    grad_out = roi_pool_grad(...)
    return grad_out, None

更新卡住构建,在 BUILD 文件//tensorflow/python/tools 目录中,添加 "//tensorflow/user_ops:roi_pooling_op_py", 作为对 freeze_graph py_binary 的依赖。

最后重新构建并安装所有内容(custom-op、freeze_graph 和 pip 包/wheel)

bazel build --config opt //tensorflow/user_ops:roi_pooling_op.so
bazel build --config opt //tensorflow/user_ops:roi_pooling_op_py
bazel build --config opt //tensorflow/python/tools:freeze_graph
bazel build --config opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

pip install --ignore-installed --upgrade /tmp/tensorflow_pkg/tensorflow-1.2.1-py2-none-any.whl

现在你可以在你的 python 代码中使用它了

from tensorflow.user_ops import roi_pooling

现在您应该能够毫无问题地卡住图表。

关于python - 在 tensorflow 中导入图形时使用新操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43880729/

相关文章:

python - 将文本文件转换为图形

python - 如何使用 SQLAlchemy ORM 指定 PostgreSQL DateStyle 属性

python - urllib、urllib2、urllib3 和 requests 模块有什么区别?

python - 在tensorflow 2中找不到Tensorflow模块,在哪里可以找到新方法的文档?

opencv - Tensorflow 如何从 OpenCV 图像帧中读取张量

python - 看起来相似的 Python for 循环之间的区别?

c++ - 在类中使用 vector 创建类

c++ - 处理大输入时 CUDA 错误

c++定义不同命名空间的枚举

macos - 内部编译器错误 : killed (program cc1plus) on MAC OS Sierra