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

Define a feed_dict in c++ for Tensorflow models

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

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

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

tensorflow::Session::Run() method is the C++ equivalent of the Python tf.Session.run() 方法,它支持使用 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 作为该对的第二个元素传递。