Запишите tf.dataset обратно в TFRecord

После создания tf.data.Dataset я хотел бы записать его в TFRecords.

Один из способов сделать это — выполнить итерацию по всему набору данных и записать после serializeToString в TFRecords. Но это не самый эффективный способ.

Есть ли более простые способы сделать это? Доступны ли какие-либо API в TF2.0?


person yuvaraj8blr    schedule 11.08.2019    source источник


Ответы (1)


Вы можете использовать наборы данных TensorFlow (tfds): эта библиотека представляет собой не только набор готовых к использованию tf.data.Dataset объектов, но это также набор инструментов для преобразования необработанных данных в TFRecords.

Следуя официальному руководству, добавить новый набор данных просто. Короче говоря, вам нужно только реализовать методы _info и _generate_examples.

В частности, _generate_examples — это метод, используемый tfds для создания строк внутри TFRecords. Каждый элемент, который выдает _generate_examples, является словарем; каждый словарь представляет собой строку в файле TFRecord.

Например (из официальной документации) generate_examples ниже используется tfds для сохранения TFRecords, каждый с записями "image_description", "image", "label".

def _generate_examples(self, images_dir_path, labels):
  # Read the input data out of the source files
  for image_file in tf.io.gfile.listdir(images_dir_path):
    ...
  with tf.io.gfile.GFile(labels) as f:
    ...

  # And yield examples as feature dictionaries
  for image_id, description, label in data:
    yield image_id, {
        "image_description": description,
        "image": "%s/%s.jpeg" % (images_dir_path, image_id),
        "label": label,
    }

В вашем случае вы можете просто использовать объект tf.data.Dataset, который у вас уже есть, и пройтись по нему (в методе generate_examples) и получить строки TFRecord.

Таким образом, tfds позаботится о сериализации, и вы найдете в папке ~/tensorflow_datasets файл TFRecord, созданный для вашего набора данных.

person nessuno    schedule 12.08.2019
comment
Да, это вариант. Но я хотел избежать повторения всего набора данных. Вместо этого, чтобы перебрать BatchedDataset (форм, например: LSTM input: 250,8,6) и, возможно, сериализовать это? Я не знаю, сработает ли это. - person yuvaraj8blr; 13.08.2019
comment
Это будет работать, вы можете создавать tfrecords с записями формы (250, 8, 6) каждая. Просто переберите пакетный набор данных и напишите каждую партию - person nessuno; 19.08.2019