2017-04-06 12 views
11

मैं इसे छोड़कर जहां इसे छोड़कर टेंसरफ्लो में एक मॉडल प्रशिक्षण को पुनरारंभ करने की कोशिश कर रहा हूं। मैं हाल ही में जोड़ा गया (0.12+ मुझे लगता है) import_meta_graph() का उपयोग करना चाहता हूं ताकि ग्राफ को पुनर्निर्माण न किया जा सके।पायथन टेंसरफ्लो: ऑप्टिमाइज़र और import_meta_graph के साथ प्रशिक्षण को पुनरारंभ कैसे करें?

मैंने इसके लिए समाधान देखा है, उदाहरण के लिए Tensorflow: How to save/restore a model?, लेकिन मैं AdamOptimizer के साथ समस्याओं में भाग लेता हूं, विशेष रूप से मुझे ValueError: cannot add op with name <my weights variable name>/Adam as that name is already used त्रुटि मिलती है। This can be fixed by initializing, लेकिन फिर मेरे मॉडल मान साफ़ कर दिए गए हैं!

अन्य उत्तर और कुछ पूर्ण उदाहरण हैं, लेकिन वे हमेशा पुराने लगते हैं और इसलिए नए import_meta_graph() दृष्टिकोण को शामिल न करें, या गैर-टेंसर ऑप्टिमाइज़र न हो। निकटतम प्रश्न मुझे मिल सकता है tensorflow: saving and restoring session लेकिन कोई अंतिम स्पष्ट कट समाधान नहीं है और उदाहरण बहुत जटिल है।

आदर्श रूप में मैं स्क्रैच, स्टॉपिंग से शुरू करने के बाद एक सरल रन-सक्षम उदाहरण चाहता हूं, फिर फिर से उठा रहा हूं। मेरे पास कुछ ऐसा है जो नीचे (नीचे) काम करता है, लेकिन यह भी आश्चर्य कीजिए कि मुझे कुछ याद आ रहा है या नहीं। निश्चित रूप से मैं अकेला ऐसा नहीं कर रहा हूं?

+0

मैं AdamOptimizer के साथ एक ही मुद्दा था। मैं अपने ऑप्स को संग्रह में डालकर काम करने में कामयाब रहा। इस उदाहरण ने मुझे बहुत मदद की: http://www.seaandsailor.com/tensorflow-checkpointing.html –

उत्तर

4

यहां मैं दस्तावेज़ों, अन्य समान समाधानों, और परीक्षण और त्रुटि को पढ़ने से आया हूं। यह यादृच्छिक डेटा पर एक साधारण ऑटोकोडर है। यदि भाग गया, तो फिर से भाग गया, यह जहां से छोड़ा गया था, वहां से जारी रहेगा (यानी पहले रन पर लागत फ़ंक्शन ~ 0.5 -> 0.3 सेकंड रन ~ 0.3 से शुरू होता है)। जब तक मुझे कुछ याद नहीं आया, तो सभी बचत, रचनाकार, मॉडल बिल्डिंग, add_to_collection की आवश्यकता होती है और एक सटीक क्रम में, लेकिन एक आसान तरीका हो सकता है।

और हाँ, import_meta_graph के साथ ग्राफ़ को लोड करना वास्तव में यहां आवश्यक नहीं है क्योंकि कोड ठीक है, लेकिन मैं अपने वास्तविक एप्लिकेशन में क्या चाहता हूं।

from __future__ import print_function 
import tensorflow as tf 
import os 
import math 
import numpy as np 

output_dir = "/root/Data/temp" 
model_checkpoint_file_base = os.path.join(output_dir, "model.ckpt") 

input_length = 10 
encoded_length = 3 
learning_rate = 0.001 
n_epochs = 10 
n_batches = 10 
if not os.path.exists(model_checkpoint_file_base + ".meta"): 
    print("Making new") 
    brand_new = True 

    x_in = tf.placeholder(tf.float32, [None, input_length], name="x_in") 
    W_enc = tf.Variable(tf.random_uniform([input_length, encoded_length], 
              -1.0/math.sqrt(input_length), 
              1.0/math.sqrt(input_length)), name="W_enc") 
    b_enc = tf.Variable(tf.zeros(encoded_length), name="b_enc") 
    encoded = tf.nn.tanh(tf.matmul(x_in, W_enc) + b_enc, name="encoded") 
    W_dec = tf.transpose(W_enc, name="W_dec") 
    b_dec = tf.Variable(tf.zeros(input_length), name="b_dec") 
    decoded = tf.nn.tanh(tf.matmul(encoded, W_dec) + b_dec, name="decoded") 
    cost = tf.sqrt(tf.reduce_mean(tf.square(decoded - x_in)), name="cost") 

    saver = tf.train.Saver() 
else: 
    print("Reloading existing") 
    brand_new = False 
    saver = tf.train.import_meta_graph(model_checkpoint_file_base + ".meta") 
    g = tf.get_default_graph() 
    x_in = g.get_tensor_by_name("x_in:0") 
    cost = g.get_tensor_by_name("cost:0") 


sess = tf.Session() 
if brand_new: 
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) 
    init = tf.global_variables_initializer() 
    sess.run(init) 
    tf.add_to_collection("optimizer", optimizer) 
else: 
    saver.restore(sess, model_checkpoint_file_base) 
    optimizer = tf.get_collection("optimizer")[0] 

for epoch_i in range(n_epochs): 
    for batch in range(n_batches): 
     batch = np.random.rand(50, input_length) 
     _, curr_cost = sess.run([optimizer, cost], feed_dict={x_in: batch}) 
     print("batch_cost:", curr_cost) 
     save_path = tf.train.Saver().save(sess, model_checkpoint_file_base) 
2

मेरे पास एक ही समस्या थी और मुझे पता चला कि कम से कम मेरे कोड में क्या गलत था।

अंत में, मैंने saver.restore() में गलत फ़ाइल नाम का उपयोग किया। इस समारोह बस saver.save() समारोह की तरह, फ़ाइल एक्सटेंशन के बिना फ़ाइल नाम दिया जाना चाहिए:

saver.restore(sess, 'model-1') 

बजाय

saver.restore(sess, 'model-1.data-00000-of-00001') 

इस के साथ मैं आपको बस इतना करना चाहते हैं वास्तव में क्या करना: शून्य से शुरू, रोकना, फिर फिर से उठाओ। मुझे tf.train.import_meta_graph() फ़ंक्शन का उपयोग करके मेटा फ़ाइल से दूसरे सेवर को प्रारंभ करने की आवश्यकता नहीं है, और मुझे ऑप्टिमाइज़र प्रारंभ करने के बाद tf.initialize_all_variables() स्पष्ट रूप से अवश्य देने की आवश्यकता नहीं है।

मेरे पूरा मॉडल इस तरह दिखता बहाल:

with tf.Session() as sess: 
    saver = tf.train.Saver() 
    sess.run(tf.global_variables_initializer()) 
    saver.restore(sess, model-1) 

मैं प्रोटोकॉल V1 में लगता है कि आप अभी भी फ़ाइल नाम के .ckpt जोड़ने के लिए किया था, और import_meta_graph() के लिए आप अभी भी .meta जोड़ने के लिए है, जो कारण हो सकता है की जरूरत है उपयोगकर्ताओं के बीच कुछ भ्रम। शायद यह दस्तावेज़ीकरण में अधिक स्पष्ट रूप से इंगित किया जाना चाहिए।

0

जब आप पुनर्स्थापना सत्र में सेवर ऑब्जेक्ट बना रहे हों तो कोई समस्या हो सकती है।

पुनर्स्थापित सत्र में नीचे दिए गए कोड का उपयोग करते समय मुझे आपके जैसा ही त्रुटि मिली।

saver = tf.train.import_meta_graph('tmp/hsmodel.meta') 
saver.restore(sess, tf.train.latest_checkpoint('tmp/')) 

लेकिन जब मैं इस तरह से बदल गया है,

saver = tf.train.Saver() 
saver.restore(sess, "tmp/hsmodel") 

त्रुटि दूर चला गया है। "tmp/hsmodel" वह पथ है जिसे मैं बचत सत्र में saver.save (sess, "tmp/hsmodel") को देता हूं।

प्रशिक्षण एमएनआईएसटी नेटवर्क (एडम ऑप्टिमाइज़र युक्त) के सत्र को संग्रहीत करने और बहाल करने के एक साधारण उदाहरण यहां हैं। यह मेरे कोड के साथ तुलना करने और समस्या को ठीक करने में मददगार था।

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/4_Utils/save_restore_model.py

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