在 C++ 中为 Tensorflow 模型定义 feed_dict

Posted

技术标签:

【中文标题】在 C++ 中为 Tensorflow 模型定义 feed_dict【英文标题】:Define a feed_dict in c++ for Tensorflow models 【发布时间】:2016-04-22 23:18:14 【问题描述】:

这个问题与这个问题有关: Export Tensorflow graphs from Python for use in C++

我正在尝试将 Tensorflow 模型从 Python 导出到 C++。问题是,我的神经网络从一个占位符开始接收输入,这需要一个 feed_dict。我找不到任何 c++ API 来为我的模型提供 feed_dict。我能做什么?

如果没有用于提供 feed_dicts 的 API,我应该如何更改我的模型,以便可以在没有占位符的情况下为 c++ 目的对其进行训练和导出?

【问题讨论】:

只是猜测,但我认为android图像识别应用程序会这样做。 【参考方案1】:

tensorflow::Session::Run() 方法是 Python tf.Session.run() 方法的 C++ 等效方法,它支持使用 inputs 参数提供张量。就像 C++ 与 Python 中的许多东西一样,它使用起来有点棘手(在这种情况下,文档看起来有点糟糕......)。

inputs 参数的类型为 const std::vector<std::pair<string, Tensor>>&。让我们分解一下:

inputs 的每个元素对应于您要在 Run() 调用中提供的单个张量(例如占位符)。元素的类型为 std::pair<string, Tensor>

std::pair<string, Tensor> 的第一个元素是您要输入的图中张量的 名称。例如,假设在 Python 中你有:

p = tf.placeholder(..., name="placeholder")
# ...
sess.run(..., feed_dict=p: ...)

...那么在 C++ 中,该对的第一个元素将是 p.name 的值,在本例中为 "placeholder:0"

std::pair<string, Tensor> 的第二个元素是您要作为tensorflow::Tensor 对象提供的值。你必须自己在 C++ 中构建它,这比定义 Numpy 数组或 Python 对象要复杂一些,但这里有一个如何指定 2 x 2 矩阵的示例:

using tensorflow::Tensor;
using tensorflow::TensorShape;

Tensor t(DT_FLOAT, TensorShape(2, 2));
auto t_matrix = t.matrix<float>();
t_matrix(0, 0) = 1.0;
t_matrix(0, 1) = 0.0;
t_matrix(1, 0) = 0.0;
t_matrix(1, 1) = 1.0;

...然后您可以将t 作为该对的第二个元素传递。

【讨论】:

非常感谢!我可以解决这个问题,如果它有效,我会告诉你。 嘿 MrRy,它成功了!我对结果很满意。我还想对毫无疑问日程繁忙的谷歌工程师抽出时间帮助像我这样的相对新手来让 Tensorflow 工作表示感谢!我花了大约 2 周时间和 6 个 *** 问题来构建一个 conv 网络并将其导出到 c++,但是你们真的帮了我很多!

以上是关于在 C++ 中为 Tensorflow 模型定义 feed_dict的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个标签问题中为 tensorflow 模型设置类权重?

如何在 C++ 中使用 TensorFlow Estimator?

设置 TensorBoard 以在 Google Colab 中为 TensorFlow 对象检测模型运行 eval.py 作业

Input_shape在自定义图层中为None

如何使用 c++ 在 tensorflow 中保存模型

tensorflow lite添加自定义操作