如何使用Tensorflow的OpOutputList?

时间:2017-08-14 20:01:48

标签: tensorflow

在github上,OpOutputList初始化如下:

OpOutputList outputs;
OP_REQUIRES_OK(context, context->output_list("output",&outputs));

并且这样添加了张量:

Tensor* tensor0 = nullptr;
Tensor* tensor1 = nullptr;
long long int sz0 = 3;
long long int sz1 = 4;
...
OP_REQUIRES_OK(context, outputs.allocate(0, TensorShape({sz0}), &tensor0));
OP_REQUIRES_OK(context, outputs.allocate(1, TensorShape({sz1}), &tensor1));

我假设OpOutputList与OpInputList类似,允许使用锯齿状数组。

我的问题是,OpOutputList如何工作?有时我会在我使用Eigen::Tensor::flat()时无法访问第一个索引的段错误,但由于我不了解分配的工作方式,因此我无法查明错误。

非常感谢。

1 个答案:

答案 0 :(得分:0)

OpOutputList对象本身是一个非常简单的值对象,只包含两个整数 - 此列表中包含的op输出的开始和结束索引。作为简单的值对象,通常只需在堆栈上创建它们,不需要“分配”。

您可以像任何其他张量一样分配逻辑上属于OpOutputList的张量。通常使用allocate_output()。以下是OpOutputList::allocate的实现:

Status OpOutputList::allocate(int i, const TensorShape& shape,
                              Tensor** output) {
DCHECK_GE(i, 0);
DCHECK_LT(i, stop_ - start_);
return ctx_->allocate_output(start_ + i, shape, output);
}

正如您所看到的那样,只检查索引i是否确实在OpOutputList范围内,并致电allocate_output