如何使用单个Run将多个输入样本提供给C ++中的张量流模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用单个Run将多个输入样本提供给C ++中的张量流模型相关的知识,希望对你有一定的参考价值。

使用python tensorflow API,可以执行以下操作:

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b

sess.run(adder_node, {a: [1,3], b: [2, 4]})

结果:[3. 7.]

有没有什么办法在C ++中通过一次调用Run方法为模型提供多个输入?我试图使用feed_dicts的std :: vector

// prepare tensorflow inputs
std::vector<std::pair<std::string, tensorflow::Tensor>> feed_dict;
for(size_t i = 0; i < noutput_items; i++) {
    tensorflow::TensorShape data_shape({1, d_vlen_in});
    tensorflow::Tensor n_tensor(tensorflow::DT_FLOAT, data_shape);
    auto n_data = n_tensor.flat<float>().data();
    for(int j = 0 ; j < d_vlen_in ; j++) {
        n_data[j] = in[j];
    }
    feed_dict.push_back(std::make_pair(d_layer_in, n_tensor));
    in += d_vlen_in;
}

// prepare tensorflow outputs
std::vector<tensorflow::Tensor> outputs;

TF_CHECK_OK(d_session->Run(feed_dict, {d_layer_out}, {}, &outputs));

d_layer_ind_layer_outstd::strings,“input”是我的输入图层/占位符。

然而它失败了:

Non-OK-status: d_session->Run(feed_dict, {d_layer_out}, {}, &outputs) status: Invalid argument: Endpoint "input" fed more than once.

有人知道这样做的方法吗?我的主要目标是提高吞吐量。

答案

所以我想出了答案,这很简单。 feed字典的几个元素用于设置几个输入变量,与python中的相同。然而,输入张量的第一(或零)维度是批量维度,其在某种情况下可以用作输入信号的时间维度。

// prepare tensorflow inputs
// dimension 0 is the batch dimension, i.e., time dimension
tensorflow::TensorShape data_shape({noutput_items, d_vlen_in});
tensorflow::Tensor in_tensor(tensorflow::DT_FLOAT, data_shape);
auto in_tensor_data = in_tensor.flat<float>().data();
for(size_t i = 0; i < noutput_items; i++) {
    for(int j = 0 ; j < d_vlen_in ; j++) {
        in_tensor_data[(i*d_vlen_in)+j] = in[(i*d_vlen_in)+j];
    }
}
std::vector<std::pair<std::string, tensorflow::Tensor>> feed_dict = {
    { d_layer_in, in_tensor },
};

// prepare tensorflow outputs
std::vector<tensorflow::Tensor> outputs;

TF_CHECK_OK(d_session->Run(feed_dict, {d_layer_out}, {}, &outputs));

这当然会引入一些缓冲/延迟,但它使我的吞吐量增加了大约1000倍。

以上是关于如何使用单个Run将多个输入样本提供给C ++中的张量流模型的主要内容,如果未能解决你的问题,请参考以下文章

Informix:如何将单个参数中的多个值传递、使用和执行到存储过程

单个 App 中的多个 RCTRootView

如何将多个变量传递给 Angular 2 中的组件?

使用 argparse 将多个 bash 数组传递给 Python

使用命名管道向 ffmpeg 提供输入

如何将初始表单值传递给 Vue.js 中的子组件?