2017-08-31 2 views
1

Ich versuche, eine Charge von 64 Bildern zu bekommen, jeder hat [64,224,224,3] Abmessungen und Beschriftungen haben [64]. Es gibt 8126 _img_class und _img_name. Ich bekomme jedoch eine unerwartete Ausgabe. Im Grunde genommen bekomme ich nichts und das Skript endet nie, wenn ich es ausführe.Etwas ging schief mit der Eingabe-Pipeline in Tensorflow

def _get_images(shuffle=True): 

"""Gets the images and labels as a batch""" 

    #get image and label list 
    _img_names,_img_class = _get_list() 
    filename_queue = tf.train.string_input_producer(_img_names) 

    #reader 
    image_reader = tf.WholeFileReader() 
    _, image_file = image_reader.read(filename_queue) 

    #decode jpeg 
    image_original = tf.image.decode_jpeg(image_file) 
    label_original = tf.convert_to_tensor(_img_class,dtype=tf.int32) 

    #image preprocessing 
    image = tf.image.resize_images(image_original, [224,224]) 
    float_image = tf.cast(image,dtype=tf.float32) 
    float_image = tf.image.per_image_standardization(image) 

    #set the shape 
    float_image.set_shape((224, 224, 3)) 
    label_original.set_shape([8126]) 

    #parameters for shuffle 
    batch_size = 64 
    num_preprocess_threads = 16 
    num_examples_per_epoch = 8000 
    min_fraction_of_examples_in_queue = 0.4 
    min_queue_examples = int(num_examples_per_epoch * 
         min_fraction_of_examples_in_queue) 
    if shuffle: 
     images_batch, label_batch = tf.train.shuffle_batch(
         [float_image,label_original], 
         batch_size=batch_size, 
         num_threads=num_preprocess_threads, 
         capacity=min_queue_examples + 3 *        
               batch_size, 
         min_after_dequeue=min_queue_examples) 
    else: 
     images_batch, label_batch = tf.train.batch(
         [float_image,label_original], 
         batch_size=batch_size, 
         num_threads=num_preprocess_threads, 
         capacity=min_queue_examples + 3 * batch_size) 

    return images_batch,label_batch 

with tf.Session() as sess: 

    tf.global_variables_initializer().run() 

    # Coordinate the loading of image files. 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    images,labels = _get_images(shuffle=True) 

    # Get an image tensor and print its value. 
    image_tensor,labels = sess.run([images,labels]) 

    # Finish off the filename queue coordinator. 
    coord.request_stop() 
    coord.join(threads) 

Als ich enqueue_many = Ich erhalte die folgenden Fehler Wahr gesetzt.

TypeError: 'Tensor' object is not iterable. 

Antwort

1

Sie müssen die queue_runners nach Aufruf der _get_images Funktion starten. Als queue ist in dieser Funktion definiert.

... 
images,labels = _get_images(shuffle=True) 
tf.global_variables_initializer().run() 
tf.local_variables_initializer().run() 
# Coordinate the loading of image files. 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord) 
image_tensor,labels = sess.run([images,labels]) 
+0

Danke. Ich habe die Ausgabe, aber meine Etiketten sind in der Dimension (64,8126) und sie werden nicht gemischt. Das ist ziemlich komisch, da ich seine Form bereits auf [8126] eingestellt habe. Ich würde mich freuen, wenn Sie etwas Licht darauf werfen könnten. Danke an –

+0

Das Problem liegt an dieser Zeile 'label_original.set_shape ([8126])'. Da label hier ein int ist, können Sie die Form als 'label_original.set_shape ([1])' setzen, um es zum 1D-Tensor zu machen. Oder Sie können die Form nicht einstellen. –

+0

Ich habe beide Wege ausprobiert, aber beide sind gescheitert. Es wird ein Fehler der Nichtübereinstimmungsgröße angezeigt. Ich verstehe den Fehler irgendwie. Für jedes Bild werden 8126 Elemente als Label betrachtet. –

Verwandte Themen