2016-09-04 5 views
0

Zuvor konvertierte ich meine Eingabebilder in TFRecords-Dateien. Jetzt habe ich die folgenden Methoden, die ich vor allem aus den Tutorials gesammelt haben und verändert ein wenig:Kann Daten auf TensorFlow nicht lesen

def read_and_decode(filename_queue): 
    reader = tf.TFRecordReader() 
    _, serialized_example = reader.read(filename_queue) 
    features = tf.parse_single_example(
     serialized_example, 
     # Defaults are not specified since both keys are required. 
     features={ 
      'image/encoded': tf.FixedLenFeature([], tf.string), 
      'image/class/label': tf.FixedLenFeature([], tf.int64), 
     }) 
    image = tf.decode_raw(features['image/encoded'], tf.uint8) 
    label = tf.cast(features['image/class/label'], tf.int32) 

    reshaped_image = tf.reshape(image,[size[0], size[1], 3]) 
    reshaped_image = tf.image.resize_images(reshaped_image, size[0], size[1], method = 0) 
    reshaped_image = tf.image.per_image_whitening(reshaped_image) 
    return reshaped_image, label 

def inputs(train, batch_size, num_epochs): 
    filename = os.path.join(FLAGS.train_dir, 
          TRAIN_FILE if train else VALIDATION_FILE) 

    filename_queue = tf.train.string_input_producer(
     [filename], num_epochs=num_epochs) 

    # Even when reading in multiple threads, share the filename 
    # queue. 
    image, label = read_and_decode(filename_queue) 

    # Shuffle the examples and collect them into batch_size batches. 
    # (Internally uses a RandomShuffleQueue.) 
    # We run this in two threads to avoid being a bottleneck. 
    images, sparse_labels = tf.train.shuffle_batch(
     [image, label], batch_size=batch_size, num_threads=2, 
     capacity=1000 + 3 * batch_size, 
     # Ensures a minimum amount of shuffling of examples. 
     min_after_dequeue=1000) 
    return images, sparse_labels 

Aber wenn ich versuche, eine Charge zu rufen ipython/Jupyter, der Prozess endet nie (es erscheint eine sein Schleife). Ich nenne es so:

batch_x, batch_y = inputs(True, 100,1) 
print batch_x.eval() 

Antwort

1

Es sieht aus wie Sie einen Anruf zu tf.train.start_queue_runners() fehlen, die die Hintergrund-Threads startet, der die Eingangsleitung (zB einige dieser Antrieb sind die von num_threads=2 implizierten Fäden in dem Aufruf von tf.train.shuffle_batch() , und die tf.train.string_input_producer() erfordert auch einen Hintergrundthread). Die folgende kleine Änderung sollte die Dinge entsperren:

batch_x, batch_y = inputs(True, 100,1) 
tf.initialize_all_variables.run() # Initializes variables. 
tf.initialize_local_variables.run() # Needed after TF version 0.10. 
tf.train.start_queue_runners()  # Starts the necessary background threads. 
print batch_x.eval() 
+0

Danke, jetzt bekomme ich die folgende Warnung: ERROR: tensorflow: Ausnahme in QueueRunner: Der Versuch, nicht initialisierte Wert input_producer/limit_epochs/Epochen \t [[Knoten zu verwenden: input_producer/limit_epochs/CountUpTo = CountUpTo [T = DT_INT64, _klasse = ["loc: @ input_producer/limit_epochs/epoches"], limit = 1000, _device = "/ job: localhost/replik: 0/task: 0/cpu: 0"] (input_producer/limit_epochs/epoches)]]. Weißt du, was könnte das verursachen? – Kevin

+0

Ich habe die Frage mit dem anderen Stück fehlenden Boilerplate aktualisiert. Sie müssen 'tf.initialize_all_variables.run()' aufrufen (oder 'sess.run (tf.initialize_all_variables())'). Wenn das nicht funktioniert (abhängig von der Version), müssen Sie möglicherweise auch 'tf.initialize_local_variables(). Run()' hinzufügen. – mrry