Numpy to TFrecords: есть ли более простой способ обработки пакетного ввода из tfrecords?

Мой вопрос о том, как получить пакетные данные из нескольких (или сегментированных) tfrecords. Я прочитал пример https://github.com/tensorflow/models/blob/master/inception/inception/image_processing.py#L410. Базовый конвейер: возьмите обучающий набор в качестве примера: (1) сначала сгенерируйте серию tfrecords (например, train-000-of-005, train-001-of-005, ...), (2) из ​​этих имен файлов, сгенерируйте список и загрузите их в tf.train.string_input_producer чтобы получить очередь, (3) одновременно сгенерируйте tf.RandomShuffleQueue, чтобы делать другие вещи, (4) используя tf.train.batch_join для генерации пакетных входных данных.

Я думаю, что это сложно, и я не уверен в логике этой процедуры. В моем случае у меня есть список .npy файлов, и я хочу сгенерировать сегментированные tfrecords (несколько разделенных tfrecords, а не только один большой файл). Каждый из этих .npy файлов содержит разное количество положительных и отрицательных образцов (2 класса). Основной метод - создать один большой файл tfrecord. Но файл слишком большой (~20Gb). Поэтому я прибегаю к сегментированным записям. Есть ли более простой способ сделать это? Спасибо.


person mining    schedule 01.08.2017    source источник


Ответы (1)


Весь процесс упрощается с использованием Dataset API. Вот обе части: (1): Convert numpy array to tfrecords и (2,3,4): read the tfrecords to generate batches.

1. Создание tfrecords из массива numpy:

    def npy_to_tfrecords(...):
       # write records to a tfrecords file
       writer = tf.python_io.TFRecordWriter(output_file)

       # Loop through all the features you want to write
       for ... :
          let say X is of np.array([[...][...]])
          let say y is of np.array[[0/1]]

         # Feature contains a map of string to feature proto objects
         feature = {}
         feature['X'] = tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten()))
         feature['y'] = tf.train.Feature(int64_list=tf.train.Int64List(value=y))

         # Construct the Example proto object
         example = tf.train.Example(features=tf.train.Features(feature=feature))

         # Serialize the example to a string
         serialized = example.SerializeToString()

         # write the serialized objec to the disk
         writer.write(serialized)
      writer.close()

2. Считайте tfrecords с помощью Dataset API (tensorflow> = 1.2):

    # Creates a dataset that reads all of the examples from filenames.
    filenames = ["file1.tfrecord", "file2.tfrecord", ..."fileN.tfrecord"]
    dataset = tf.contrib.data.TFRecordDataset(filenames)
    # for version 1.5 and above use tf.data.TFRecordDataset

    # example proto decode
    def _parse_function(example_proto):
      keys_to_features = {'X':tf.FixedLenFeature((shape_of_npy_array), tf.float32),
                          'y': tf.FixedLenFeature((), tf.int64, default_value=0)}
      parsed_features = tf.parse_single_example(example_proto, keys_to_features)
     return parsed_features['X'], parsed_features['y']

    # Parse the record into tensors.
    dataset = dataset.map(_parse_function)  

    # Shuffle the dataset
    dataset = dataset.shuffle(buffer_size=10000)

    # Repeat the input indefinitly
    dataset = dataset.repeat()  

    # Generate batches
    dataset = dataset.batch(batch_size)

    # Create a one-shot iterator
    iterator = dataset.make_one_shot_iterator()

    # Get batch X and y
    X, y = iterator.get_next()
person vijay m    schedule 01.08.2017
comment
Привет, сэр, этот api поддерживает num_threads или capacity, как это в tf.train.shuffle_batch api? В моем случае, если сеть небольшая, то выполнение в графическом процессоре происходит быстрее, чем загрузка данных, что приводит к простоям графического процессора. Поэтому я хочу, чтобы очередь на выборку данных всегда была заполнена. Спасибо. - person mining; 11.08.2017
comment
Спасибо большое! - person mining; 11.08.2017
comment
Спасибо за этот хороший пример - используя reader = tf.TFRecordReader(); key, value = reader.read(filename_queue), я получаю обратно пару ключ-значение (значение соответствует example_proto в вашем коде). Как я могу получить ключ с помощью dataset = tf.contrib.data.TFRecordDataset(filenames)? - person Mr_and_Mrs_D; 30.09.2017
comment
Можно ли сохранить shapeofnparray в TFRecord, а затем изменять его форму, используя его аналогично stackoverflow.com/a/42603692/2184122? Я не могу сопоставить старый способ и способ набора данных. - person Robert Lugg; 09.01.2018
comment
Что такое example_proto? Строковые или байтовые данные? где назначена эта переменная? на что это назначено? - person Uchiha Madara; 16.07.2018
comment
Большое спасибо, у меня есть вопросы. Почему вы расплющили X? Мои массивы numpy - это массивы изображений, и у меня есть 51 выход для y. Мне тоже нужно их сгладить? более того, когда я пробую этот код, оперативная память достигает 90% (у меня 32 ГБ ОЗУ), и программа вылетает. Вы можете определить проблему? - person Amin Marshal; 06.12.2019
comment
Я пробовал это, но получаю TypeError: array([ 3., 9., 3., ..., 17., 8., 17.], dtype=float32) has type numpy.ndarray, but expected one of: int, long, float ошибку в инструкции example = tf.train.Example(features=tf.train.Features(feature=feature)) - person Shantanu Shinde; 08.10.2020