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