2016-08-07 3 views
5

मैं एक ऐसे मॉडल को प्रशिक्षण दे रहा हूं जहां इनपुट वेक्टर दूसरे मॉडल का आउटपुट हो। उसी प्रक्रिया में दूसरे मॉडल को स्क्रैच से (tf.initialize_variables() का उपयोग करके) प्रारंभ करते समय चेकपॉइंट फ़ाइल से पहला मॉडल बहाल करना शामिल है।टेन्सफोर्लो में एक से अधिक सत्र और आलेख (उसी प्रक्रिया में)

कोड और अमूर्तता की एक बड़ी मात्रा है, इसलिए मैं यहां प्रासंगिक अनुभागों को चिपका रहा हूं।

self.variables = [var for var in all_vars if var.name.startswith(self.name)] 
saver = tf.train.Saver(self.variables, max_to_keep=3) 
self.save_path = tf.train.latest_checkpoint(os.path.dirname(self.checkpoint_path)) 

if should_restore: 
    self.saver.restore(self.sess, save_path) 
else: 
    self.sess.run(tf.initialize_variables(self.variables)) 

प्रत्येक मॉडल का अपना ग्राफ और सत्र के भीतर दायरे वाला, इस तरह::

self.graph = tf.Graph() 
self.sess = tf.Session(graph=self.graph) 

with self.sess.graph.as_default(): 
    # Create variables and ops. 

एक मॉडल के भीतर सभी चर variable_scope भीतर बनाई गई हैं

निम्नलिखित बहाल कोड है संदर्भ प्रबंधक

खिला इस प्रकार काम करता है:

  • एक पृष्ठभूमि धागा input = scipy.misc.imread(X) पर sess.run(inference_op) कॉल करता है और एक अवरुद्ध धागा सुरक्षित कतार में परिणाम डालता है।
  • मुख्य प्रशिक्षण लूप कतार से पढ़ता है और दूसरे मॉडल पर sess.run(train_op) पर कॉल करता है।

समस्या:
मैं देख रहा हूँ कि नुकसान मूल्यों, यहां तक ​​कि प्रशिक्षण (दूसरे मॉडल) के पहले चरण में रन के पार तेजी से बदल रहा है रखने के (और कुछ पुनरावृत्तियों में नेन हो जाते हैं)। मैंने पुष्टि की कि पहले मॉडल का उत्पादन हर समय बिल्कुल वही है। पहले मॉडल के sess.run पर टिप्पणी करते हुए और इसे एक मसालेदार फ़ाइल से समान इनपुट के साथ बदलने से यह व्यवहार नहीं दिखता है।

यह train_op है:

loss_op = tf.nn.sparse_softmax_cross_entropy(network.feedforward()) 
    # Apply gradients. 
    with tf.control_dependencies([loss_op]): 
     opt = tf.train.GradientDescentOptimizer(lr) 
     grads = opt.compute_gradients(loss_op) 
     apply_gradient_op = opt.apply_gradients(grads) 

    return apply_gradient_op 

मैं जानता हूँ कि यह अस्पष्ट है, लेकिन मैं अधिक जानकारी प्रदान करने के लिए खुश हूँ। किसी भी मदद की सराहना की है!

उत्तर

1

समस्या विभिन्न सत्र वस्तुओं के समवर्ती निष्पादन के कारण निश्चित रूप से हो रही है। मैंने बैकग्राउंड थ्रेड से मुख्य थ्रेड तक पहला मॉडल का सत्र स्थानांतरित कर दिया, नियंत्रित प्रयोग को कई बार दोहराया (24 घंटे से अधिक समय तक चल रहा था और अभिसरण तक पहुंच गया) और NaN कभी नहीं देखा। दूसरी तरफ, समवर्ती निष्पादन कुछ मिनटों के भीतर मॉडल को अलग करता है।

मैंने सभी मॉडलों के लिए एक सामान्य सत्र ऑब्जेक्ट का उपयोग करने के लिए अपना कोड पुनर्गठित किया है।

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। क्या आप अपना समाधान विस्तारित कर सकते हैं? –

+1

'sess.run' को समवर्ती रूप से न चलाएं। Tensorflow (सभी खुलासा) GPU स्मृति का पूरा नियंत्रण मानता है। दो अलग-अलग प्रक्रियाओं या धागे में एक साथ sess.run' चलाना मुद्दों का कारण बन जाएगा। – Vikesh

संबंधित मुद्दे