Mj1*_*992 6 c++ python tensorflow
我正在尝试将从Tensorflow Python导出的图形导入Tensorflow C++.我已经成功地将图形重新导入Python.我现在唯一想要的是用C++编写相同的代码,但我不确定C++ api函数和用法,因为Tensorflow网站上的文档不够好.
这是我到目前为止找到的C++代码.
C++:
namespace tf = tensorflow;
tf::Session* session;
tf::Status status = tf::NewSession(tf::SessionOptions(), &session);
checkStatus(status);
tf::GraphDef graph_def;
status = ReadBinaryProto(tf::Env::Default(), "./models/frozen_model.pb", &graph_def);
checkStatus(status);
status = session->Create(graph_def);
checkStatus(status);
tf::Tensor x(tf::DT_FLOAT, tf::TensorShape());
tf::Tensor y(tf::DT_FLOAT, tf::TensorShape());
x.scalar<float>()() = 23.0;
y.scalar<float>()() = 19.0;
std::vector<std::pair<tf::string, tf::Tensor>> input_tensors = {{"x", x}, {"y", y}};
std::vector<string> vNames; // vector of names for required graph nodes
vNames.push_back("prefix/input_neurons:0");
vNames.push_back("prefix/prediction_restore:0");
std::vector<tf::Tensor> output_tensors;
status = session->Run({}, vNames, {}, &output_tensors);
checkStatus(status);
tf::Tensor output = output_tensors[0];
std::cout << "Success: " << output.scalar<float>() << "!" << std::endl;
session->Close();
return 0;
Run Code Online (Sandbox Code Playgroud)
我在上面的当前c ++代码中遇到的问题是它说它无法通过名称找到任何操作prefix/input_neurons:0.虽然图中有一个操作,因为当我在Python代码中导入这个图形时(如下所示),它可以很好地工作.
这是成功导入图形的Python代码.
Python :(完美无缺)
def load_graph(frozen_graph_filename):
# We load the protobuf file from the disk and parse it to retrieve the
# unserialized graph_def
with tf.gfile.GFile(frozen_graph_filename, "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
# Then, we can use again a convenient built-in function to import a graph_def into the
# current default Graph
with tf.Graph().as_default() as graph:
tf.import_graph_def(
graph_def,
input_map=None,
return_elements=None,
name="prefix",
op_dict=None,
producer_op_list=None
)
return graph
# We use our "load_graph" function
graph = load_graph("./models/frozen_model.pb")
# We can verify that we can access the list of operations in the graph
for op in graph.get_operations():
print(op.name) # <--- printing the operations snapshot below
# prefix/Placeholder/inputs_placeholder
# ...
# prefix/Accuracy/predictions
# We access the input and output nodes
x = graph.get_tensor_by_name('prefix/input_neurons:0')
y = graph.get_tensor_by_name('prefix/prediction_restore:0')
# We launch a Session
with tf.Session(graph=graph) as sess:
test_features = [[0.377745556,0.009904444,0.063231111,0.009904444,0.003734444,0.002914444,0.008633333,0.000471111,0.009642222,0.05406,0.050163333,7e-05,0.006528889,0.000314444,0.00649,0.043956667,0.016816667,0.001644444,0.016906667,0.00204,0.027342222,0.13864]]
# compute the predicted output for test_x
pred_y = sess.run( y, feed_dict={x: test_features} )
print(pred_y)
Run Code Online (Sandbox Code Playgroud)
更新
我可以从python脚本打印操作.这是截图.
这是我得到的错误.
请参阅Run 函数参考:在 c++ 中,输入首先是输入字典,然后是输出节点,然后是需要运行的其他操作,然后是输出向量(可选地带有额外参数,但看起来您不需要他们)。这个调用应该有效:
status = session->Run({{"prefix/input_neurons:0", x}}, {"prefix/prediction_restore:0"}, {}, &output_tensors);
Run Code Online (Sandbox Code Playgroud)
如果你想设置x为与 python 中相同的值(很可能有一种方法可以在不复制数据的情况下做到这一点,但我不知道如何),你可以在调用之前执行此操作Run():
std::vector<float> test_features = {0.377745556,0.009904444,0.063231111,0.009904444,0.003734444,0.002914444,0.008633333,0.000471111,0.009642222,0.05406,0.050163333,7e-05,0.006528889,0.000314444,0.00649,0.043956667,0.016816667,0.001644444,0.016906667,0.00204,0.027342222,0.13864};
int n_features = test_features.size();
x= tf::Tensor(tf::DT_FLOAT, tf::TensorShape({1,n_features}));
auto x_mapped = x.tensor<float, 2>();
for (int i = 0; i< n_features; i++)
{
x_mapped(0, i) = test_features[i];
}
Run Code Online (Sandbox Code Playgroud)
告诉我这个是否更好!