2016-12-16 5 views
0

Я пытаюсь реализовать входной конвейер для своей модели, которая читает из двоичных файлов TFRecords; каждый двоичный файл содержит один пример (изображение, ярлык, другие вещи, которые мне нужны)Входной конвейер тензорного потока: образцы читаются более одного раза

У меня есть текстовый файл с файловым списком путей; то:

  1. Я прочитал текстовый файл как список, который я передаю string_input_producer() для генерации очереди;
  2. я кормить очереди к TFRecordReader, который читает сериализованный пример, и я декодировать двоичные данные
  3. Я использую shuffle_batch(), чтобы расположить примеры во партии
  4. Я использую партию, чтобы оценить мою модель

проблема заключается в том, что оказывается, что один и тот же пример можно прочитать несколько раз, а некоторые примеры вообще не могут быть посещены; Я установил количество шагов как общее количество изображений, деленное на размер партии; поэтому я ожидаю, что в конце последнего шага все входные примеры были посещены, но это не так; вместо этого некоторые из них посещаются более одного раза, а некоторые никогда (случайно); это делает моя оценка тест полностью unrealiable

если кто-нибудь имеет намек на то, что я делаю неправильно, пожалуйста, дайте мне знать

упрощенная версия моего кода для тестирования модели ниже; Спасибо!

def my_input(file_list, batch_size) 

    filename = [] 
    f = open(file_list, 'r') 
    for line in f: 
     filename.append(params.TEST_RECORDS_DATA_DIR + line[:-1]) 

    filename_queue = tf.train.string_input_producer(filename) 

    reader = tf.TFRecordReader() 
    _, serialized_example = reader.read(filename_queue) 

    features = tf.parse_single_example(
     serialized_example, 
     features={ 
      'image_raw': tf.FixedLenFeature([], tf.string), 
      'label_raw': tf.FixedLenFeature([], tf.string), 
      'name': tf.FixedLenFeature([], tf.string) 
      }) 

    image = tf.decode_raw(features['image_raw'], tf.uint8) 
    image.set_shape(params.IMAGE_HEIGHT*params.IMAGE_WIDTH*3) 
    image = tf.reshape(image, (params.IMAGE_HEIGHT,params.IMAGE_WIDTH,3)) 
    image = tf.cast(image, tf.float32)/255.0 
    image = preprocess(image) 

    label = tf.decode_raw(features['label_raw'], tf.uint8) 
    label.set_shape(params.NUM_CLASSES) 

    name = features['name'] 

    images, labels, image_names = tf.train.batch([image, label, name], 
      batch_size=batch_size, num_threads=2, 
      capacity=1000 + 3 * batch_size, min_after_dequeue=1000) 

    return images, labels, image_names 


def main() 

    with tf.Graph().as_default(): 

     # call input operations 
     images, labels, image_names = my_input(file_list=params.TEST_FILE_LIST, batch_size=params.BATCH_SIZE) 

     # load a trained model and make predictions  
     prediction = infer(images, labels, image_names) 

     with tf.Session() as sess: 

      for step in range(params.N_STEPS): 
       prediction_values = sess.run([prediction]) 
       # process output 

    return 

ответ

0

Мое предположение было бы, что tf.train.string_input_producer(filename) устанавливается для получения файла на неопределенное время, и если вы партия примеры в нескольких (2) нити, это может быть так, что один поток уже начал обработку файла во второй раз, в то время как другой еще не смог завершить первый раунд. Для того, чтобы прочитать каждый пример в точности один, используйте:

tf.train.string_input_producer(filename, num_epochs=1) 

и инициализировать локальные переменные в начале сессии:

sess.run(tf.initialize_local_variables()) 
+0

спасибо за ответ; – bfra

+0

Я установил количество потоков в 1, num_epochs = 1, и я инициализирую локальные переменные, как вы сказали; то я получаю следующую ошибку: W tensorflow/core/framework/op_kernel.cc: 968] Вне диапазона: FIFOQueue '_1_batch/fifo_queue' закрыт и имеет недостаточные элементы (запрошенный 1, текущий размер 0) – bfra

+0

после 177 примеров, которые ровно половину числа примеров для оценки; есть что-то концептуальное, я, вероятно, отсутствую – bfra

Смежные вопросы