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

San*_*der 3 c++ python deep-learning tensorflow

这个问题与这个问题有关: 从Python导出Tensorflow图以便在C++中使用

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

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

mrr*_*rry 11

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: ...})
    
    Run Code Online (Sandbox Code Playgroud)

    ...然后在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;
    
    Run Code Online (Sandbox Code Playgroud)

    ...然后你可以t作为对的第二个元素传递.

  • 嘿MrRy,它有效!我对结果非常满意.我还要感谢谷歌工程师,他们无疑有繁忙的日程安排,找到时间帮助像我一样的新人让Tensorflow工作!我花了大约2周和6个stackoverflow问题来构建一个转换网并将其导出到c ++,但是你们真的帮了我很多! (3认同)