gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:16:07 25 4
gpt4 key购买 nike

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

关于c++ - 在 Tensorflow C++ 中使用 FIFOQueue 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61855881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com