在加载了C ++ API的模型上指定输入/输出节点以在TensorFlow 1.0+中运行推理

时间:2017-11-27 15:21:44

标签: c++ machine-learning tensorflow

我正在使用TensorFlow 1.4 C ++ API加载V2检查点,这个答案非常简单:https://stackoverflow.com/a/43639305/9015277。但是,此答案未指定如何将输入馈送到加载的网络。

在TF 1.4中,ClientSession::Run()的输入可以使用FeedType对象指定,该对象定义为:

std::unordered_map< Output, Input::Initializer, OutputHash > FeedType

这里每个Output键表示由OP产生的张量值。使用C ++ API中构建的图形,我想只是传递输入占位符是相当简单的,但是如何使用从V2检查点加载的图形来做同样的事情呢?

在这个例子中(使用我认为的r0.12 api)https://github.com/tensorflow/tensorflow/blob/ab0fcaceda001825654424bf18e8a8e0f8d39df2/tensorflow/examples/label_image/main.cc#L346它再次简单明了,这些图层只是给出了它们的名字。但是我如何对新API做同样的事情呢?

2 个答案:

答案 0 :(得分:2)

好吧,我没有得到任何有用的答案,所以最后我最终只使用旧的C ++ API(BTW仍在r1.4中工作)。我仍然在寻找一个如何使用新API完成此操作的答案。

在旧的TF API Session :: Run中如下:

virtual Status Run(
  const std::vector< std::pair< string, Tensor > > & inputs,
  const std::vector< string > & output_tensor_names,
  const std::vector< string > & target_node_names,
  std::vector< Tensor > *outputs
)=0

inputs向量中的字符串允许使用python图形定义中的名称来指定网络中的输入,类似于在python上使用feed_dict的方式。这是我在python中输入占位符的图形定义:

with tf.variable_scope('global'):
    velocity_state = tf.placeholder(shape=[None, 1],
                                    dtype=tf.float32,
                                    name='velocity_state')

在C ++中使用一些虚拟数据和运行推理来提供此特定占位符:

using namespace tensorflow;

// specifying input node name and creating tensor to feed it
string velocity_state_placeholder = "global/velocity_state";
Tensor velocity_state = Input::Initializer((float)0.0, TensorShape({1, 1})).tensor;

// collecting all inputs
std::vector<std::pair<string, Tensor>> input_feed;
input_feed.push_back(std::make_pair(velocity_state_placeholder, velocity_state));

// output node name
string action_distribution = "global/fully_connected_1/Softmax";

// tensor for results
std::vector<Tensor> output_tensors;

// running inference
Status run_status = session->Run(input_feed,
                                {action_distribution},
                                {},
                                &output_tensors);

答案 1 :(得分:0)

根据TensorFlow API1.4 documentationtensorflow::ClientSession::Run具有以下签名:

Status Run (
  const FeedType & inputs,
  const std::vector< Output > & fetch_outputs,
  const std::vector< Operation > & run_outputs,
  std::vector< Tensor > *outputs
) const;

FeedType

的typedef
std::unordered_map< Output, Input::Initializer, OutputHash > FeedType