производительность — Как передать несколько входных выборок в модель тензорного потока в C ++ с одним прогоном

С помощью 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 метод? Я пытался использовать std :: vector feed_dicts

// 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_in а также d_layer_out являются std::strings«input» — это мой входной слой / заполнитель.

Однако это не с:

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

Кто-нибудь знает способ сделать это? Моя главная цель здесь — улучшить пропускную способность.

1

Решение

Так что я разобрался с ответом, и он довольно прост.
Несколько элементов словаря каналов используются для установки нескольких входных переменных, как в 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-кратное увеличение производительности.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]