2016-04-01 7 views
13

मैं अंतिम पूलिंग परत की विशेषताओं को छवियों के नए डेटासेट के लिए प्रतिनिधित्व वैक्टर के रूप में निकालने के लिए tensorflow के imageNet trained model का उपयोग कर रहा हूं।पर काबू पाने के लिए ग्राफ़डेफ़ 2 जीबी से बड़ा नहीं हो सकता है

मॉडल के रूप में है एक नई छवि पर भविष्यवाणी की है इस प्रकार है:

python classify_image.py --image_file new_image.jpeg 

मैं मुख्य कार्य संपादित ताकि मैं छवियों का एक फ़ोल्डर लेने के लिए और एक बार में सभी छवियों पर भविष्यवाणी लौटने और सुविधा लिख ​​सकते हैं एक सीएसवी फ़ाइल में वैक्टर।

def main(_): 
    maybe_download_and_extract() 
    #image = (FLAGS.image_file if FLAGS.image_file else 
    #   os.path.join(FLAGS.model_dir, 'cropped_panda.jpg')) 
    #edit to take a directory of image files instead of a one file 
    if FLAGS.data_folder: 
    images_folder=FLAGS.data_folder 
    list_of_images = os.listdir(images_folder) 
    else: 
    raise ValueError("Please specify image folder") 

    with open("feature_data.csv", "wb") as f: 
    feature_writer = csv.writer(f, delimiter='|') 

    for image in list_of_images: 
     print(image) 
     current_features = run_inference_on_image(images_folder+"/"+image) 
     feature_writer.writerow([image]+current_features) 

यह लगभग 21 छवियों के लिए ठीक काम किया लेकिन उसके बाद निम्न त्रुटि के साथ दुर्घटनाग्रस्त हो गया:

File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1912, in as_graph_def 
    raise ValueError("GraphDef cannot be larger than 2GB.") 
ValueError: GraphDef cannot be larger than 2GB. 

मैं विधि बुला run_inference_on_image(images_folder+"/"+image) पिछले छवि डेटा होगा द्वारा सोचा यहाँ मैं कैसे किया है कि है केवल नए छवि डेटा पर विचार करने के लिए अधिलेखित, जो मामला प्रतीत नहीं होता है। इस मुद्दे को कैसे हल करें?

उत्तर

17

समस्या यह है कि run_inference_on_image()प्रत्येक कॉल को उसी ग्राफ में नोड्स जोड़ते हैं, जो अंततः अधिकतम आकार से अधिक हो जाता है। इसे ठीक करने के लिए कम से कम दो तरीके हैं:

  1. आसान लेकिन धीमी गति से रास्ता run_inference_on_image() की प्रत्येक कॉल के लिए एक अलग डिफ़ॉल्ट ग्राफ उपयोग करने के लिए है:

    for image in list_of_images: 
        # ... 
        with tf.Graph().as_default(): 
        current_features = run_inference_on_image(images_folder+"/"+image) 
        # ... 
    
  2. अधिक शामिल लेकिन अधिक कुशल तरीका एकाधिक छवियों पर चलाने के लिए run_inference_on_image() को संशोधित करना है। लूप को this sess.run() call से घूमने के लिए अपने for लूप को स्थानांतरित करें, और आपको अब प्रत्येक कॉल पर पूरे मॉडल का पुनर्निर्माण नहीं करना होगा, जिससे प्रत्येक छवि को अधिक तेज़ी से संसाधित करना चाहिए।

+2

मैं दूसरे विकल्प के साथ गया और यह तेज़ है। विचार के लिए धन्यवाद! – MedAli

+0

हालांकि एक सवाल है, sess.run '' 'predictions = sess.run (pool_3_tensor, {'DecodeJpeg/content: 0': image_data के पूर्वानुमान भाग में केवल एक की बजाय छवियों की एक सरणी पास करने का कोई तरीका है }) '' – MedAli

+1

मुझे लगता है कि विशेष फ़ीड बिंदु केवल एक छवि पर काम करता है। ग्राफ को बदलना संभव होगा ताकि यह छवियों का एक बैच ले ले, लेकिन इसके लिए छवियों को एक बैच में गठबंधन करने के लिए 'prefetching thread (उदाहरण के लिए' tf.train.batch() ') का उपयोग करना होगा (जिसे करना होगा सभी का एक ही आकार है), और फिर नेटवर्क में थोड़ा बाद में बिंदु में फ़ीड करें। इनपुट के रूप में उपयोग किए जाने वाले टेंसर को बदलने के लिए आपको 'input_map' तर्क' tf.import_graph_def() 'का उपयोग करना होगा। चूंकि उस विशेष ग्राफ की संरचना अनियंत्रित है, हालांकि यह चुनौतीपूर्ण हो सकता है ... – mrry

2

आप कहीं से पहले इस पाश for image in list_of_images: (जो फ़ाइलों पर लूप) को create_graph() स्थानांतरित कर सकते हैं।

यह वही ग्राफ पर कई बार अनुमान लगा रहा है।

+0

क्या आप स्पष्टता के लिए इसका एक उदाहरण दिखा सकते हैं? धन्यवाद। – Moondra

0

सबसे आसान तरीका मुख्य समारोह के पहले create_graph() डाल दिया गया है। फिर, यह केवल ग्राफ बनाने के लिए केवल

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