2015-11-17 4 views
21

आप दो संबंध तोड़ना रेखांकन, और उन्हें लिंक करना चाहते हैं, तो इस मोड़:टेन्सफोर्लो: गणना नोड में नोड को कैसे बदलें?

x = tf.placeholder('float') 
y = f(x) 

y = tf.placeholder('float') 
z = f(y) 
इस में

:

x = tf.placeholder('float') 
y = f(x) 
z = g(y) 

वहाँ ऐसा करने के लिए कोई तरीका है? ऐसा लगता है कि यह कुछ मामलों में निर्माण आसान बना सकता है।

उदाहरण के लिए यदि आपके पास एक ग्राफ है जिसमें tf.placeholder के रूप में इनपुट छवि है, और इनपुट छवि, गहरी सपना शैली को अनुकूलित करना चाहते हैं, तो प्लेसहोल्डर को tf.variable नोड के साथ बदलने का कोई तरीका है? या ग्राफ बनाने से पहले आपको इसके बारे में सोचना है?

उत्तर

18

टी एल; डॉ: आप अजगर कार्यों के रूप में दो संगणना परिभाषित कर सकते हैं, तो आप उस करना चाहिए। यदि आप नहीं कर सकते हैं, तो ग्राफ़र्सफ़्लो में ग्राफिक्स को क्रमबद्ध और आयात करने के लिए और अधिक उन्नत कार्यक्षमता है, जो आपको विभिन्न स्रोतों से आलेख लिखने की अनुमति देती है।

with tf.Graph().as_default() as g_1: 
    input = tf.placeholder(tf.float32, name="input") 
    y = f(input) 
    # NOTE: using identity to get a known name for the output tensor. 
    output = tf.identity(y, name="output") 

gdef_1 = g_1.as_graph_def() 

with tf.Graph().as_default() as g_2: # NOTE: g_2 not g_1  
    input = tf.placeholder(tf.float32, name="input") 
    z = g(input) 
    output = tf.identity(y, name="output") 

gdef_2 = g_2.as_graph_def() 

तो फिर तुम एक तिहाई ग्राफ में gdef_1 और gdef_2 रचना कर सकते हैं:

एक तरह से TensorFlow में ऐसा करने के लिए, अलग tf.Graph वस्तुओं के रूप में संबंध तोड़ना संगणना के निर्माण के लिए फिर उन्हें धारावाहिक प्रोटोकॉल बफ़र्स में बदलने का Graph.as_graph_def() उपयोग कर रहा है , tf.import_graph_def() का उपयोग कर:

with tf.Graph().as_default() as g_combined: 
    x = tf.placeholder(tf.float32, name="") 

    # Import gdef_1, which performs f(x). 
    # "input:0" and "output:0" are the names of tensors in gdef_1. 
    y, = tf.import_graph_def(gdef_1, input_map={"input:0": x}, 
          return_elements=["output:0"]) 

    # Import gdef_2, which performs g(y) 
    z, = tf.import_graph_def(gdef_2, input_map={"input:0": y}, 
          return_elements=["output:0"] 
+0

क्या कोई कारण है कि मैं उपरोक्त परिणामों के उपयोग से ट्रेन नहीं कर सकता, यानी 'tf.train.AdamOptimizer() जैसे कुछ। Minimize (tf.nn.l2_loss (z-x))'? मुझे – bge0

+3

ऑप्टिमाइज़ करने के लिए कोई चर नहीं है जैसे दुर्भाग्य से सही है। वर्कअराउंड tf.get_default_graph() में op के लिए 'vars = op.outputs [0] करना है। Get_operations() अगर op.type == "वैरिएबल"] 'तो' var_list = vars' को' minimize() ' । – mrry

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद! 'Y = f (इनपुट) 'के लिए आपके उदाहरण में मैंने' tf.mul (w, इनपुट)' का उपयोग करके सरल कोशिश की, जहां 'w ~ N (0, 0.01)' [i.e. एक टीएफ। वैरिएबल]। चर के संग्रह का उपयोग करके मुझे लगता है कि 'w' एकत्र किया जा रहा है लेकिन फिर भी यह त्रुटि प्राप्त होती है:' TypeError: तर्क एक टीएफ नहीं है। वैरिएबल: टेंसर ("आयात/डब्ल्यू: 0", dtype = float32_ref) ' – bge0

3

आप प्रशिक्षित मॉडलों गठबंधन करने के लिए (उदाहरण के एक नए मॉडल में एक pretrained मॉडल के कुछ हिस्सों पुन: उपयोग करने के लिए) चाहते हैं, y कहां पहले मॉडल के चेकपॉइंट को सहेजने के लिए Saver का उपयोग कर सकते हैं, फिर उस मॉडल को पूरी तरह से या आंशिक रूप से किसी अन्य मॉडल में पुनर्स्थापित करें।

with tf.Graph().as_default() as g1: 
    x = tf.placeholder('float') 
    w = tf.Variable(1., name="w") 
    y = x * w 
    saver = tf.train.Saver() 

with tf.Session(graph=g1) as sess: 
    w.initializer.run() 
    # train... 
    saver.save(sess, "my_model1.ckpt") 

with tf.Graph().as_default() as g2: 
    x = tf.Variable(2., name="v") 
    w = tf.Variable(0., name="w") 
    z = x + w 
    restorer = tf.train.Saver([w]) # only restore w 

with tf.Session(graph=g2) as sess: 
    x.initializer.run() # x now needs to be initialized 
    restorer.restore(sess, "my_model1.ckpt") # restores w=1 
    print(z.eval()) # prints 3. 
+0

अगर मैं सही करता हूं तो मुझे सही करें गलत है लेकिन यह दृष्टिकोण आपकी ग्राफ़ संरचना को सहेजता नहीं है, इसलिए जब भी आप चर का उपयोग करना चाहते हैं तो आपको फिर से परिभाषित करने की आवश्यकता होती है। – Pietrko

3

ऐसा नहीं है कि tf.train.import_meta_graph अंतर्निहित करने के लिए सभी अतिरिक्त तर्क गुजरता है पता चला है:

उदाहरण के लिए, आप मॉडल 2 में मॉडल 1 के वजन पुन: उपयोग करने w, और यह भी एक प्लेसहोल्डर से एक चर के लिए x परिवर्तित चाहते हैं का कहना है कि import_scoped_meta_graph जिसमें input_map तर्क है और इसे import_graph_def के अपने (आंतरिक) आमंत्रण में प्राप्त होने पर इसका उपयोग करता है।

यह प्रलेखित है नहीं, और मुझे waaaay toooo यह पता लगाने के लिए ज्यादा समय ले लिया है, लेकिन यह काम करता है!

+0

बहुत बहुत धन्यवाद, मैंने लंबे समय तक ऐसा उत्तर खोजा है। – Tom