在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()
时无法访问第一个索引的段错误,但由于我不了解分配的工作方式,因此我无法查明错误。
非常感谢。
答案 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
。