在 Tensorflow C++ 中使用 FIFOQueue 时遇到问题

Trouble using FIFOQueue in Tensorflow C++

我在 tensorflow 中使用这种编程格式与其他操作取得了一些成功,但我无法使 FIFOQueue 正常工作。以下代码将编译并运行,但队列中永远不会有任何数据。

vector<Tensor> outputs;
Scope root = Scope::NewRootScope();

auto queue = FIFOQueue(root, {DT_STRING}, FIFOQueue::Capacity(4));
auto enqueue = QueueEnqueue(root, queue, {{"test_string"}});
auto queue_size = QueueSize(root.WithOpName("queue_size"), queue);

unique_ptr<Session> session(NewSession(SessionOptions()));
GraphDef graph;

root.ToGraphDef(&graph);
session->Create(graph);
Status status = session->Run({}, {"queue_size"}, {}, &outputs);

if (status.ok()) {
    if (outputs.size() > 0) {
        cout << outputs[0].DebugString();
    }
}

QueueSize 始终为零,如果我尝试使用队列中的数据,程序会挂起,我推测是因为队列为空。如果大家有什么线索,请帮忙,我能想到的都试过了。

非常感谢。

我其实已经很接近了,但是对通话的性质有些误解。图中的每个操作都从队列开始,因此重复调用 session->运行 请求适当的输出是影响队列操作所需要的。下面是一个稍微更详细的示例。它使用占位符将两个值推送到队列,然后检查大小,然后从队列中弹出这两个值。

vector<Tensor> result_1;
vector<Tensor> result_2;
vector<Tensor> result_3;

Scope root = Scope::NewRootScope();

Placeholder dummy(root.WithOpName("dummy"), DT_INT32);

FIFOQueue queue(root.WithOpName("queue"), {DT_INT32});
QueueEnqueue enqueue(root.WithOpName("enqueue"), queue, {dummy.output});
QueueDequeue dequeue(root.WithOpName("dequeue"), queue, {DT_INT32});
QueueClose close(root.WithOpName("close"), queue);
QueueClose cancel(root.WithOpName("cancel"), queue, QueueClose::CancelPendingEnqueues(true));
QueueSize size(root.WithOpName("size"), queue);

GraphDef graph_def;
unique_ptr<Session> session(NewSession(SessionOptions()));
TF_RETURN_IF_ERROR(root.ToGraphDef(&graph_def));
TF_RETURN_IF_ERROR(session->Create(graph_def));

Tensor t(1984);
pair<string, Tensor> val = {"dummy", t};

TF_RETURN_IF_ERROR(session->Run({val}, {}, {"enqueue"}, nullptr));
TF_RETURN_IF_ERROR(session->Run({val}, {}, {"enqueue"}, nullptr));

TF_RETURN_IF_ERROR(session->Run({}, {"size"}, {}, &result_3));

TF_RETURN_IF_ERROR(session->Run({}, {"dequeue"}, {}, &result_1));
TF_RETURN_IF_ERROR(session->Run({}, {"dequeue"}, {}, &result_2));

int value_1 = *result_1[0].scalar<int>().data();
int value_2 = *result_2[0].scalar<int>().data();
int value_3 = *result_3[0].scalar<int>().data();

TF_RETURN_IF_ERROR(session->Run({}, {}, {"close"}, nullptr));

cout << "returned value_1: " << value_1 << 
       " return value_2: " << value_2 << 
       " size was: " << value_3 << endl;

return Status::OK();