2015-12-02 13 views
8

मेरे पास छवियों की एक निर्देशिका है, और लेबल के लिए एक अलग फ़ाइल मिलान छवि फ़ाइल नाम हैं।टेंसर फ्लो में फ़ाइल कतार से फ़ाइल नाम तक पहुंच

train/001.jpg 1 
train/002.jpg 2 
... 

मैं आसानी से फ़ाइल नाम से एक filequeue बनाकर टेन्सर फ्लो में छवि निर्देशिका से छवियों को लोड कर सकते हैं:: तो छवियों की निर्देशिका की तरह 'ट्रेन/001.jpg' और जैसे लेबलिंग फ़ाइल लग रहा है फ़ाइलें है

filequeue = tf.train.string_input_producer(filenames) 
reader = tf.WholeFileReader() 
img = reader.read(filequeue) 

लेकिन मुझे इन फ़ाइलों को लेबलिंग फ़ाइल से लेबल के साथ जोड़ने के लिए नुकसान हुआ है। ऐसा लगता है कि मुझे प्रत्येक चरण में कतार के अंदर फ़ाइल नामों तक पहुंच की आवश्यकता है। क्या उन्हें पाने का कोई तरीका है? इसके अलावा, मेरे पास फ़ाइल नाम होने के बाद, मुझे फ़ाइल नाम से लेबल किए गए लेबल को देखने में सक्षम होना चाहिए। ऐसा लगता है कि एक मानक पायथन शब्दकोश काम नहीं करेगा क्योंकि ग्राफ में प्रत्येक चरण में इन गणनाओं को होने की आवश्यकता है।

उत्तर

10

यह देखते हुए कि आपके डेटा एक पायथन सरणी के रूप में फ़ाइल नामों की सूची प्रदान करने के लिए बहुत बड़ा नहीं है, मैं सुझाव देता हूं कि केवल पायथन में प्रीप्रोकैसिंग करना। फ़ाइल नामों और लेबलों की दो सूचियों (एक ही क्रम) बनाएं, और उनको एक यादृच्छिक शफलक्यू या कतार में डालें, और उस से हटा दें। यदि आप string_input_producer के "लूप असीमित" व्यवहार चाहते हैं, तो आप प्रत्येक युग की शुरुआत में 'enqueue' को फिर से चला सकते हैं।

एक बहुत ही खिलौना उदाहरण:

import tensorflow as tf 

f = ["f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8"] 
l = ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"] 

fv = tf.constant(f) 
lv = tf.constant(l) 

rsq = tf.RandomShuffleQueue(10, 0, [tf.string, tf.string], shapes=[[],[]]) 
do_enqueues = rsq.enqueue_many([fv, lv]) 

gotf, gotl = rsq.dequeue() 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    tf.train.start_queue_runners(sess=sess) 
    sess.run(do_enqueues) 
    for i in xrange(2): 
     one_f, one_l = sess.run([gotf, gotl]) 
     print "F: ", one_f, "L: ", one_l 

महत्वपूर्ण यह है कि आप प्रभावी रूप से फ़ाइल नाम/लेबल के जोड़े enqueueing रहे हैं जब आप enqueue करते हैं, और उन जोड़े dequeue द्वारा दिया जाता है।

+0

ठीक है कि मुझे बिल्कुल वही चाहिए! मैंने सिर्फ दो में अजगर से मिलान नहीं किया था और इसे पहले से घुमाया था- मैं केवल सीआईएफएआर ट्यूटोरियल से कोड का उपयोग करने की कोशिश कर रहा था जो फाइल लोड करता है और उसके बाद इसे बाद में घुमाता है। – bschreck

+0

असल में मैंने अभी कोशिश की और मुझे लगता है कि मेरी फाइलनाम सूची बहुत बड़ी है। इस कोड का उपयोग करके यह बस लटकता है, लेकिन जब मैं अपनी सूची में तत्वों की संख्या को कम करता हूं तो काम करता है। रास्ते में 87,000 फाइलें हैं। – bschreck

+0

दिलचस्प - यह वास्तव में लटका नहीं होना चाहिए। क्या आपने यादृच्छिक शफलक्यू अधिकतम को उस चीज की संख्या को संभालने के लिए काफी बड़ा किया है जिसे आप इसमें डाल रहे हैं? मैं चेतावनी दूंगा कि मैंने कभी भी यादृच्छिक शफल कतार की कोशिश नहीं की है। :) यदि आप स्मृति को सहेजना चाहते हैं, तो आप फ़ाइल को सीएसवी के रूप में फिर से लिख सकते हैं, एक सीएसवी डीकोडर पर पाइप किए गए टेक्स्टलाइनर का उपयोग कर सकते हैं, और फिर इसे क्यूई में फेंकने के लिए एक queuerunner के साथ फेंक दें। हालांकि, केवल 1 एमबी फाइलनामों के लिए बहुत काम है। – dga

4

यहां मैं क्या करने में सक्षम था। तब

lv = tf.constant(labels) 
label_fifo = tf.FIFOQueue(len(filenames),tf.int32, shapes=[[]]) 
file_fifo = tf.train.string_input_producer(filenames, shuffle=False, capacity=len(filenames)) 
label_enqueue = label_fifo.enqueue_many([lv]) 

:

मैं पहली बार फ़ाइल नामों को बदल दिया और अजगर में उनमें लेबल मिलान नहीं हुआ:

np.random.shuffle(filenames) 
labels = [label_dict[f] for f in filenames] 

फिर बंद शफ़ल साथ फ़ाइल नामों के लिए एक string_input_producer बनाया है, और लेबल के लिए एक फीफो छवि को पढ़ने के लिए मैं एक होलफाइल रीडर का उपयोग कर सकता हूं और लेबल प्राप्त करने के लिए मैं फीफो को हटा सकता हूं:

reader = tf.WholeFileReader() 
image = tf.image.decode_jpeg(value, channels=3) 
image.set_shape([128,128,3]) 
result.uint8image = image 
result.label = label_fifo.dequeue() 

और इस प्रकार बैचों उत्पन्न:

min_fraction_of_examples_in_queue = 0.4 
min_queue_examples = int(num_examples_per_epoch * 
         min_fraction_of_examples_in_queue) 
num_preprocess_threads = 16 
images, label_batch = tf.train.shuffle_batch(
    [result.uint8image, result.label], 
    batch_size=FLAGS.batch_size, 
    num_threads=num_preprocess_threads, 
    capacity=min_queue_examples + 3 * FLAGS.batch_size, 
    min_after_dequeue=min_queue_examples) 
+0

लेबल में पढ़ने का यह ढांचा मेरे कोड में अच्छी तरह फिट बैठता है जो छवि फ़ाइल नामों में पढ़ने के लिए 'tf.WholeFileReader' का भी उपयोग करता है, हालांकि, उपयोगकर्ताओं को प्रशिक्षण शुरू करने से पहले 'sess.run (label_enqueue)' चलाने के लिए याद रखना होगा अन्यथा प्रोग्राम वहां लटकता है और एनक्यू ऑपरेशन होने के लिए इंतजार कर रहा है। –

+0

मैं आपके कोड के समान विचारों का उपयोग करने की कोशिश कर रहा था, लेकिन मैं लेबल को छवियों के साथ समन्वयित रखने में सक्षम नहीं था। http://stackoverflow.com/questions/43567552/tf-slice-input-producer-not-keeping-tensors-in-sync – rasen58

1

है tf.py_func() आप लेबल करना फ़ाइल पथ से एक मानचित्रण लागू करने के लिए उपयोग कर सकता है।

files = gfile.Glob(data_pattern) 
filename_queue = tf.train.string_input_producer(
files, num_epochs=num_epochs, shuffle=True) # list of files to read 

def extract_label(s): 
    # path to label logic for cat&dog dataset 
    return 0 if os.path.basename(str(s)).startswith('cat') else 1 

def read(filename_queue): 
    key, value = reader.read(filename_queue) 
    image = tf.image.decode_jpeg(value, channels=3) 
    image = tf.cast(image, tf.float32) 
    image = tf.image.resize_image_with_crop_or_pad(image, width, height) 
    label = tf.cast(tf.py_func(extract_label, [key], tf.int64), tf.int32) 
    label = tf.reshape(label, []) 

training_data = [read(filename_queue) for _ in range(num_readers)] 

... 

tf.train.shuffle_batch_join(training_data, ...) 
0

मैं इस्तेमाल किया यह:

filename = filename.strip().decode('ascii') 
0

एक और सुझाव TFRecord प्रारूप में अपने डेटा को बचाने के लिए है। इस मामले में आप एक ही फाइल में सभी छवियों और सभी लेबलों को सहेजने में सक्षम होंगे।फ़ाइलों की एक बड़ी संख्या के लिए यह फायदे का एक बहुत देता है:

  • एक ही जगह
  • डेटा एक ही स्थान पर (विभिन्न निर्देशिका याद करने की कोई जरूरत)
  • अगर पर आवंटित किया जाता है पर डेटा और लेबल स्टोर कर सकते हैं वहाँ कई फाइलें (छवियां) हैं, फाइल खोलना/बंद करना समय लेने वाला है। एसएसडी/एचडीडी से फ़ाइल के स्थान की तलाश में समय लगता है
संबंधित मुद्दे