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

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 с помощью 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()