TensorFlow:每个输入的可变输出数量,仅在运行时

时间:2016-07-14 11:03:39

标签: tensorflow

我在Tensorflow中编写一个操作,它接受一些输入(对文件的引用),并根据该输入(文件的一堆“块”)产生可变数量的输出。在构建图形时指定每个块的大小(例如,来自文件= 1块的50个“记录”),但是在构造图形时,输入的总大小(文件中的记录数)是未知的。我无法指定这个先验因为输入文件很大(10英寸),所以扫描它对我的应用程序来说是不可行的。

我的第一次失败尝试是让op每次Compute调用产生一个“输出块”。但是,这使得剩余的块没有产生给定的输入。经过进一步检查,看起来运行时不是为此设计的(尽管如果我错了请告诉我!)。

我尝试将op的输出创建为张量,仅在第一维中未知。例如,如果单个块的输出是TensorShape([2])(使用TensorShape构造函数),则多块版本的输出将为TensorShape([None, 2])。但是,这排除了我使用Tensorflow的许多其他功能(例如FIFOQueue,它需要完全定义的形状)。

可以在Tensorflow中创建操作,其中以下任何一项都是真的吗?

  • 每个输入的输出数量可以大于1(例如,如果我在操作上调用Compute 5次并且每个输入有5个“块”,则操作只会“消耗”一个输入)< / LI>
  • 形状尚未完全指定,但我仍然可以使用Tensorflow库(例如队列)

2 个答案:

答案 0 :(得分:1)

我最终直接使用了张量流队列。

在操作定义中:

REGISTER_OP("MyOp")
...
.Input("output_queue_handle: resource")
...;

然后在op内核中:

#include "tensorflow/core/framework/queue_interface.h"

class MyOpImpl : public OpKernel {
...
void Compute(OpKernelContext *ctx) override {
if (!output_queue) {
    OP_REQUIRES_OK(LookupResource(ctx, HandleFromInput(ctx, 1), &output_queue_));
}

while (there_is_still_stuff_to_enqueue_from_input) {
... // do actual computation here
QueueInterface::Tuple tuple;
// construct tuple here
OP_REQUIRES_OK(output_queue_->ValidateTuple(tuple);
Notification n;
queue_->TryEnqueue(tuple, ctx, [&n]() { n.Notify(); });
n.WaitForNotification();
}

return Status::OK();
}

private:
QueueInterface *output_queue_ = nullptr;
};

答案 1 :(得分:-1)

您可以使用张量流队列。

张量流队列允许您将大量项目泵入其中,而无需事先指定多少项目。然后可以读取队列,直到它为空。