gpt4 book ai didi

tensorflow - 如何将 std::vector 转换为张量而无需在 C++ 中的 tensorflow 中复制?

转载 作者:行者123 更新时间:2023-12-02 11:19:27 26 4
gpt4 key购买 nike

在c++中,多维矩阵存储在std::vector<float>中.我需要在使用张量的 tensorflow 中使用它。来自 std::vector 的转换对张量来说似乎并不明显。有一个 c_api 将向量转换为 TF_Tensor而不是 Tensor . std::copy也可以,但我想在没有复制的情况下执行转换。

最佳答案

Tensorflow 现在可以通过提供您自己的 tensorflow::TensorBuffer 并使用 following constructor 在 C++ API 中执行此操作:

#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 之外自己做。

关于tensorflow - 如何将 std::vector<float> 转换为张量而无需在 C++ 中的 tensorflow 中复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37037962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com