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