tensorflow::Tensor 到 python Tensor 或 numpy.nd_array

Posted

技术标签:

【中文标题】tensorflow::Tensor 到 python Tensor 或 numpy.nd_array【英文标题】:tensorflow::Tensor to python Tensor or numpy.nd_array 【发布时间】:2017-03-27 14:04:59 【问题描述】:

我有一个 C++ tensorflow::Tensor,我试图在 Python 中访问其内容。

我查看了Tensorflow C++ Documentation 以寻找可以将tensorflow::Tensor 转换为任何合理的PyObject 的函数(现在不管这是tf.Tensor 还是numpy.nd_array)。

翻遍Tensorflow Code后,我发现了以下线索:

tensorflow/python/client/tf_session_helper.cc 中定义了一个方法TF_Tensor_to_PyObject(TF_Tensor* Tensor, PyObject** out_array)。然而,这是在一个隐藏的 Bazel 包中定义的,而且在一个匿名的 C++ 命名空间中。修改 Tensorflow 本身似乎不直观(我必须修改 Bazel BUILD 文件、.h 和 .cc 文件),并编译我自己的 Tensorflow 以使用这种方法。

这种方法的另一个问题是TF_Tensor != tensorflow::TensorTF_Tensor 是在 Tensorflow 的 C-Api 中定义的,并且在那里,转换也不打算供公众使用(如:在此包之外)。

有人知道更好的方法吗? tensorflow::TensorPyObject 是否存在我在搜索时没有找到的现有实现?

【问题讨论】:

【参考方案1】:

py_func 操作的实现有code to convert Tensor to PyObject。

【讨论】:

【参考方案2】:

更准确地说,应该这样做:

#include "tensorflow/python/lib/core/py_func.h"

Status TensorHandler::ExportTensorAsNumpy(const Tensor *inputTensor) 
    PyObject* numpyObject = Py_None;
    tensorflow::ConvertTensorToNdarray(*inputTensor, &numpyObject);

    //process the numpy further its now stored in numpyObject

    //call this when you don't use the numpyObject anymore
    Py_DECREF(numpyObject);

当你不使用 numpy 对象时不要忘记调用 Py_DECREF 否则你的程序会导致内存泄漏。也不要忘记在你的 bazel 构建中包含 py_func 作为依赖项。

【讨论】:

以上是关于tensorflow::Tensor 到 python Tensor 或 numpy.nd_array的主要内容,如果未能解决你的问题,请参考以下文章

AI - TensorFlow Tensor

tensorflow::Tensor 的 flat 方法以啥顺序返回数据?

关于类型为numpy,TensorFlow.tensor,torch.tensor的shape变化以及相互转化

tensorflow tensor 索引

TensorFlow tensor张量拼接concat & stack

tensorflow与pytorch张量互转