2016-04-17 7 views
8

में उपयोग के लिए पायथन से निर्यात टेंसफोर्लो ग्राफ निर्यात करें सटीक रूप से सी ++ में उपयोग के लिए पाइथन मॉडल को कैसे निर्यात किया जाना चाहिए?सी ++

मैं इस ट्यूटोरियल के लिए इसी तरह कुछ करने के लिए कोशिश कर रहा हूँ: https://www.tensorflow.org/versions/r0.8/tutorials/image_recognition/index.html

मैं स्थापना के समय से एक की जगह में C++ एपीआई में अपने ही TF मॉडल आयात करने के लिए कोशिश कर रहा हूँ। मैंने इनपुट आकार और पथ समायोजित किए, लेकिन अजीब त्रुटियां पॉप-अप रहती रहती हैं। मैंने पूरे दिन स्टैक ओवरफ्लो और अन्य मंचों को पढ़ा लेकिन कोई फायदा नहीं हुआ।

मैंने ग्राफ को निर्यात करने के लिए दो विधियों का प्रयास किया है।

विधि 1: अनुच्छेद।

...loading inputs, setting up the model, etc.... 

sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 


for i in range(num_steps): 
    x_batch, y_batch = batch(50) 
    if i%10 == 0: 
     train_accuracy = accuracy.eval(feed_dict={ 
     x:x_batch, y_: y_batch, keep_prob: 1.0}) 
     print("step %d, training accuracy %g"%(i, train_accuracy)) 
    train_step.run(feed_dict={x: x_batch, y_: y_batch, keep_prob: 0.5}) 

print("test accuracy %g"%accuracy.eval(feed_dict={ 
    x: features_test, y_: labels_test, keep_prob: 1.0})) 

saver = tf.train.Saver(tf.all_variables()) 
checkpoint = 
    '/home/sander/tensorflow/tensorflow/examples/cat_face/data/model.ckpt' 
    saver.save(sess, checkpoint) 

    tf.train.export_meta_graph(filename= 
    '/home/sander/tensorflow/tensorflow/examples/cat_face/data/cat_graph.pb', 
    meta_info_def=None, 
    graph_def=sess.graph_def, 
    saver_def=saver.restore(sess, checkpoint), 
    collection_list=None, as_text=False) 

विधि 1 निम्न त्रुटि जब कार्यक्रम चलाने के लिए कोशिश कर रहा है पैदावार:

[libprotobuf ERROR 
google/protobuf/src/google/protobuf/wire_format_lite.cc:532] String field 
'tensorflow.NodeDef.op' contains invalid UTF-8 data when parsing a protocol 
buffer. Use the 'bytes' type if you intend to send raw bytes. 
E tensorflow/examples/cat_face/main.cc:281] Not found: Failed to load 
compute graph at 'tensorflow/examples/cat_face/data/cat_graph.pb' 

मैं भी एक और तरीका कोशिश की ग्राफ निर्यात के:

विधि 2: write_graph:

tf.train.write_graph(sess.graph_def, 
'/home/sander/tensorflow/tensorflow/examples/cat_face/data/', 
'cat_graph.pb', as_text=False) 

यह संस्करण वास्तव में कुछ लोड करने लगता है, लेकिन मुझे चर के बारे में कोई त्रुटि नहीं मिली प्रारंभ:

Running model failed: Failed precondition: Attempting to use uninitialized 
value weight1 
[[Node: weight1/read = Identity[T=DT_FLOAT, _class=["loc:@weight1"], 
_device="/job:localhost/replica:0/task:0/cpu:0"](weight1)]] 
+3

नहीं है। इससे वेरिएबल का उपयोग करने और ओपन को पुनर्स्थापित करने से बचा जाता है - https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py –

+0

आह, मैंने इसे देखा है। लेकिन मैं अपने तर्कों को भरने का तरीका जानने के लिए संघर्ष करता हूं, जैसे कि मुझे नहीं पता कि export_meta_graph में प्रत्येक तर्क के लिए क्या भरना है। क्या आप इसके लिए कुछ उदाहरण कोड जानते हैं? – Sander

+1

यहां एक उदाहरण दिया गया है: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph_test.py –

उत्तर

0

सबसे पहले, आप निम्न आदेश का उपयोग करके फाइल करने के लिए परिभाषा ग्राफ़ बनाने के लिए

with tf.Session() as sess: 
//Build network here 
tf.train.write_graph(sess.graph.as_graph_def(), "C:\\output\\", "mymodel.pb") 

फिर,

saver = tf.train.Saver(tf.global_variables()) 
saver.save(sess, "C:\\output\\mymodel.ckpt") 

फिर सेवर का उपयोग करके अपने मॉडल को बचाने की जरूरत है, तो आप करना होगा आपके आउटपुट पर 2 फाइलें, mymodel.ckpt, mymodel.pb

से freeze_graph.py डाउनलोड करेंऔर सी: \ output \ में निम्न आदेश चलाएं। आउटपुट नोड नाम बदलें यदि यह आपके लिए अलग है।

अजगर freeze_graph.py --input_graph mymodel.pb --input_checkpoint mymodel.ckpt --output_node_names softmax/Reshape_1 --output_graph mymodelforc.pb

आप mymodelforc.pb सी से सीधे उपयोग कर सकते हैं

आप प्रोटो फ़ाइल

#include "tensorflow/core/public/session.h" 
#include "tensorflow/core/platform/env.h" 
#include "tensorflow/cc/ops/image_ops.h" 

Session* session; 
NewSession(SessionOptions(), &session); 

GraphDef graph_def; 
ReadBinaryProto(Env::Default(), "C:\\output\\mymodelforc.pb", &graph_def); 

session->Create(graph_def); 

अब आप अनुमान के लिए सत्र का उपयोग कर सकते लोड करने के लिए सी कोड निम्न का उपयोग कर सकते हैं।

आप निम्नलिखित के रूप में अनुमान पैरामीटर आवेदन कर सकते हैं: ": उपयोग freeze_graph विधि 3"

// Same dimension and type as input of your network 
tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({ 1, height, width, channel })); 
std::vector<tensorflow::Tensor> finalOutput; 

// Fill input tensor with your input data 

std::string InputName = "input"; // Your input placeholder's name 
std::string OutputName = "softmax/Reshape_1"; // Your output placeholder's name 

session->Run({ { InputName, input_tensor } }, { OutputName }, {}, &finalOutput); 

// finalOutput will contain the inference output that you search for 
+0

क्या tensorflow संस्करण डेनिज़? कारण मैं पूछता हूं कि 'saver.save' function मैं जिस पैकेज का उपयोग कर रहा हूं वह एक' .ckpt.meta' फ़ाइल बनाने लगता है। मुझे लगता है कि यह वही बात है जो 'saver.export_meta_graph' बनाता है ... हाल के इंटरनेट शोध से संकेत मिलता है कि यह आर 11 और आर 12 के बीच एक अंतर था, लेकिन आपने हाल ही में यह लिखा था कि मैं सोच रहा हूं कि आपने किस संस्करण का उपयोग किया था। – Geronimo

+0

मैंने इस कोड को वर्तमान में अद्यतित tensorflow स्रोत के साथ सत्यापित किया है। हालांकि, सी ++ रन के लिए ckpt.meta फ़ाइलों की आवश्यकता नहीं है क्योंकि आप पहले से ही "write_graph" का उपयोग कर निर्यात करते हैं। भ्रम को रोकने के लिए मैं कोड अपडेट करूंगा –