如何在C ++中从原始指针数据构造tensorflow :: Tensor

时间:2017-03-15 12:23:35

标签: c++ tensorflow

我想在操作期间更改输出张量的基础存储。

我有一个新数据的原始指针(float *)。我想在启动内核并返回之前将输出张量设置为这个新数据,这样我就可以劫持这个操作。

但是我很困惑我什么时候应该删除原始指针,因为张量结构似乎是浅拷贝。我只能在所有这个张量的使用完成后删除原始指针。但是我如何通知这个?

2 个答案:

答案 0 :(得分:3)

在TensorFlow运行时中没有用于执行此操作的公共API,但可以使用C API方法TF_NewTensor()从原始指针创建Tensor对象,该方法具有以下签名:

// Return a new tensor that holds the bytes data[0,len-1].
//
// The data will be deallocated by a subsequent call to TF_DeleteTensor via:
//      (*deallocator)(data, len, deallocator_arg)
// Clients must provide a custom deallocator function so they can pass in
// memory managed by something like numpy.
extern TF_Tensor* TF_NewTensor(TF_DataType, const int64_t* dims, int num_dims,
                               void* data, size_t len,
                               void (*deallocator)(void* data, size_t len,
                                                   void* arg),
                               void* deallocator_arg);

在内部,这会创建一个引用计数TensorBuffer对象,该对象获取原始指针的所有权。 (很遗憾,只有C API有friend access才能直接从tensorflow::Tensor创建TensorBuffer。这是open issue。)调用deallocator函数当引用计数降至零时,datalendellocator_arg的值。

答案 1 :(得分:1)

不幸的是,这个信息太少,无法给出准确答案。可能,你甚至不允许删除指针!

想象一下这样的事情:

float* gf = nullptr; // global pointer (just for illustration)

void calculate()
{
   float f;
   gf = &f;
   doSomething();
   gf = nullptr;
}

同样适用,如果您的指针指向某个类静态或全局变量。

如果你在堆上创建变量,那么当你知道你不再需要它时就删除它,这可以在本地(通常)处理,例如在这个例子中:

class C
{
   std::vector<float>values;

   C(size_t num) : values(num, 0.0f) { }
   ~C() { } // data deleted automatically with vector

   void function()
   {
        for(float& f : values)
        {
            gf = &f;
            doSomething();
        }
        gf = nullptr;
   }
};

缺少对operator delete[]的显式调用?好吧,矢量对我来说是隐含处理的,所以我不必费心。即使您被迫使用原始指针,也可以通过使用e来避免删除删除。 G。 std::unique_ptr ...注意向量:如果向向量添加新元素或从向量中删除包含的元素,指针可能无效!

在我的示例中,我将gf指针显式设置为nullptr,以便您可以检查何时没有使用浮动值 - 您必须在劫持时检查,当然......请注意,在多线程环境中,您可能会保护指针免受竞争条件的影响。