如何将std :: vector <float>转换为张量而不在c ++中的tensorflow中复制?

时间:2016-05-04 21:03:30

标签: tensorflow

在c ++中,多维矩阵存储在std::vector<float>中。我需要在tensorflow中使用它,它使用张量。从std::vector到张量的转换似乎并不明显。有一个c_api将向量转换为TF_Tensor而不是Tensorstd::copy也有效,但我想在没有副本的情况下执行转换。

1 个答案:

答案 0 :(得分:1)

Tensorflow现在可以在C ++ API中通过提供自己的tensorflow::TensorBuffer并使用following constructor来做到这一点:

#include <tensorflow/core/framework/tensor.h>
#include <tensorflow/core/framework/types.pb.h>
...
tensorflow::Tensor(tensorflow::DataType type, const TensorShape & shape, TensorBuffer *buf)

由于tensorflow::TensorBuffer是一个抽象类,因此您需要对其进行子类化并自己实现一些方法(这很容易做到)。需要注意的一件事:注意我们如何OwnsMemory()返回false。如果要使用手动内存管理(malloc / free或new / delete),则可以将其设置为true,然后自己覆盖析构函数。就是说,由于您使用的是vector,所以我将其设置为false并注意不要使缓冲区超出范围。完成后,vector仍将释放其内部内存。

例如;

class MyBuffer: public tensorflow::TensorBuffer {
    std::size_t len_;
  public:
    MyBuffer(void* data, std::size_t len): len_(len), tensorflow::TensorBuffer(data){}
    //returns how many bytes we have in our buffer
    std::size_t size() const override {return len_;};
    //needed so TF knows this isn't a child of some other buffer
    TensorBuffer* root_buffer() override { return this; }
    // Not actually sure why we need this, but it lets TF know where the memory for this tensor came from
    void FillAllocationDescription(tensorflow::AllocationDescription* proto) const override{};
    // A value of false indicates this TensorBuffer does not own the underlying data
    bool OwnsMemory() const override { return false; }
}

然后,您只需要提供正确的tensorflow::DataType(例如tensorflow::DT_FLOAT32)和tensorflow::TensorShape(您可以实例化它并使用<TensorShape>.addDim(<the dimension>)添加每个维度。您可以通过以下方式修改上述内容:将std::vector存储在内部,然后使用.data()void*强制转换为MyBuffer构造一个包含向量的构造函数,以公开内容。或者,您也可以在MyBuffer之外自己做。