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

Trouble using FIFOQueue in Tensorflow C++

本文关键字:FIFOQueue 遇到 问题 Tensorflow C++      更新时间:2023-10-16

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

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 总是导致零,如果我尝试使用队列中的数据,程序会挂起,我推测是因为队列是空的。 如果你有任何线索,请帮忙,我已经尝试了我能想到的一切。

非常感谢。

我实际上非常接近,但对通话的性质有一些误解。 图形中的每个操作都从队列开始,因此需要重复调用会话>Run请求适当的输出才能实现队列的操作。 下面是一个稍微更详细的示例。 它使用占位符将两个值推送到队列,然后检查大小,然后从队列中弹出两个值。

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();