2017-07-05 2 views
0

Je reçois cette erreur pour le code mentionné ci-dessous. Merci de m'aider avec ça. Ce code imprime les variables nombre de lots chaque fois que j'exécute ce code. Je suis incapable de comprendre l'erreur.Erreur dans le pipeline d'entrée utilisant des files d'attente dans tensorflow

OutOfRangeError (voir ci-dessus pour traceback): FIFOQueue '_2_batch/fifo_queue' est fermée et présente des éléments insuffisants (demande 15, la taille actuelle 0) [[Noeud: lot = QueueDequeueManyV2 [component_types = [DT_FLOAT] , timeout_ms = -1, _device = "/ job: localhost/réplique: 0/tâche: 0/cpu: 0"] (lot/fifo_queue, lot/n)]]

import tensorflow as tf 
import numpy as np 
import os 

batch_size = 16 
min_queue = 256 


def load_image(): 
    length = calculate_size("./Coco_subset_5356") 

    names = tf.train.match_filenames_once("./Coco_subset_5356/*.jpg") 

    # Extracted names from the file 
    filename_queue = tf.train.string_input_producer(names) 

    #Initialised the File reader 
    reader = tf.WholeFileReader() 

    key, value = reader.read(filename_queue) 
    my_img = tf.image.decode_jpeg(value, channels = 3) 
    my_img = tf.image.resize_images(my_img, [256,256]) 
    my_img.set_shape((256,256,3)) 


    print(length) 

    images = tf.train.batch(
     [my_img], 
     batch_size=batch_size, 
     num_threads=1, 
     capacity=min_queue + 3*batch_size) 

    print(images) 

with tf.Session() as sess: 
    #sess.run(init_op) 
    tf.local_variables_initializer().run() 
    #print(tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES)) 

    #For coordination between queue runner and the reader 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord = coord) 
    for j in range(length/batch_size): 
     #optimizer.run(feed_dict={input_batch: images[i]) 
     x = sess.run(images)  
     print(j) 
     print(x.shape) 

    coord.request_stop() 
    coord.join(threads) 

def calculate_size(img_dir): 
    file = [] 
    for subdir, dirs, files in os.walk(img_dir): 
     for i in files: 
      i = os.path.join(img_dir, i) 
      file.append(i) 
     length = len(file) 
    return length 

load_image() 
+0

J'ai eu un problème similaire et dans mon cas, certaines images n'étaient pas correctement décodées (dans mon jeu de données j'avais des images 1x1 pixels qui ont réussi à passer à travers le processus de filtrage ..). Êtes-vous certain * tous * que vos images peuvent être correctement ouvertes et décodées en tant que fichiers jpg? (Ils ne doivent pas non plus être tronqués, le tensorflow par défaut produira une erreur lors du traitement des images tronquées) – GPhilo

+0

Quel est le nombre de fichiers * .jpg dans le répertoire? Est-ce un multiple de 15? Que faire si vous définissez 'allow_smaller_final_batch = True' dans la méthode' tf.train.batch'? – npf

+0

Aussi, cela vous dérangerait-il d'éditer votre question pour rendre l'erreur plus lisible (par exemple en utilisant la marque>)? – npf

Répondre

0

Avis: Ce n'est pas une bonne réponse, mais je ne peux pas poster de code dans un commentaire et cela pourrait vous indiquer dans le droit ction.

Comme prévu dans mon commentaire à la question, j'ai eu la même erreur sur l'un de mes jeux de données. Dans mon cas, le problème était que toutes les images de mon jeu de données ne pouvaient pas être décodées en tant que fichiers jpg. Des images tronquées et, dans mon cas, des images de 1 x 1 pixel étaient cachées dans mes données et chaque fois que j'essayais de traiter l'ensemble de données, les files d'attente fermaient les erreurs de reporting que j'avais du mal à suivre.

Je résolu le problème d'écrire un script petit filtre qui passe par tous les fichiers un par un et enregistre ceux qu'il ne peut pas traiter:

import tensorflow as tf 
import glob 

image_data_placeholder = tf.placeholder(tf.string) 

filenames = glob.glob(r'C:\my_test_folder\*.jpg') 
decoded_img_op = tf.image.decode_jpeg(image_data_placeholder) 

with tf.Session() as sess: 
    for fn in filenames: 
    with open(fn, 'rb') as fp: 
     image_data = fp.read() 
    try: 
     sess.run(decoded_img_op, feed_dict={image_data_placeholder:image_data}) 
    except: 
     # log the filename o the broken image (or delete/move/etc) 
     print('Cannot decode file {}'.format(fn)) 

Il est pas des implémentations les plus efficaces, mais il était assez bon pour mon cas d'utilisation.