Tensorflow 1.10 TFRecordDataset - восстановление TFRecords - PullRequest
0 голосов
/ 28 августа 2018

Примечания:

  1. этот вопрос распространяется на предыдущий мой вопрос . В этом вопросе я спрашиваю о наилучшем способе хранения фиктивных данных в виде Example и SequenceExample, чтобы выяснить, что лучше для данных, аналогичных предоставленным фиктивным данным. Я предоставляю как явные формулировки конструкции Example и SequenceExample, так и, в ответах, программный способ сделать это.

  2. Поскольку это все еще много кода, я предоставляю файл Colab (интерактивный блокнот jupyter, размещенный в Google), в котором вы можете попробовать код самостоятельно, чтобы помочь. Весь необходимый код есть, и он щедро прокомментирован.

Я пытаюсь научиться конвертировать мои данные в TF Records, поскольку заявленные преимущества имеют смысл для моих данных. Тем не менее, документация оставляет желать лучшего, и учебники / блоги (которые я видел), которые пытаются углубиться, действительно касаются только поверхности или перефразируют редкие документы, которые существуют.

Для демонстрационных данных, рассмотренных в моем предыдущем вопросе - а также здесь - я написал приличный класс, который принимает:

  • последовательность с n каналами (в этом примере она основана на целых числах, фиксированной длины и с n каналами)
  • вероятности класса с мягкой меткой (в этом примере есть n классов и основанные на числах с плавающей точкой)
  • некоторые метаданные (в этом примере строка и два числа с плавающей запятой)

и может кодировать данные в 1 из 6 форм:

  1. Пример: каналы / классы последовательностей разделены числовым типом (в данном случае int64) с метаданными, прикрепленными к
  2. Пример, с последовательными каналами / классами, отдельными в виде байтовой строки (через numpy.ndarray.tostring()) с метаданными, прикрепленными к
  3. Пример, с последовательностью / классами, выгруженными в виде байтовой строки, с метаданными, прикрепленными к

  4. SequenceExample с каналами / классами последовательностей, разделенными числовым типом, и метаданными в качестве контекста

  5. SequenceExample с каналами последовательности, разделенными в виде байтовой строки, и метаданными в качестве контекста
  6. SequenceExample, с последовательностью и классами, выгруженными в виде строки байтов, и метаданными в качестве контекста.

Это отлично работает.

В Colab я показываю, как записывать фиктивные данные в одном и том же файле, а также в отдельных файлах.

У меня вопрос, как я могу восстановить эти данные?

Я дал 4 попытки сделать это в связанном файле.

Почему TFReader отличается от подпакета от TFWriter?

1 Ответ

0 голосов
/ 02 сентября 2018

Решено путем обновления функций для включения информации о форме и запоминания, что SequenceExample являются безымянными FeatureLists.

context_features = {
    'Name' : tf.FixedLenFeature([], dtype=tf.string),
    'Val_1': tf.FixedLenFeature([], dtype=tf.float32),
    'Val_2': tf.FixedLenFeature([], dtype=tf.float32)
}

sequence_features = {
    'sequence': tf.FixedLenSequenceFeature((3,), dtype=tf.int64),
    'pclasses'  : tf.FixedLenSequenceFeature((3,), dtype=tf.float32),
}

def parse(record):
  parsed = tf.parse_single_sequence_example(
        record,
        context_features=context_features,
        sequence_features=sequence_features
  )
  return parsed


filenames = [os.path.join(os.getcwd(),f"dummy_sequences_{i}.tfrecords") for i in range(3)]
dataset = tf.data.TFRecordDataset(filenames).map(lambda r: parse(r))

iterator = tf.data.Iterator.from_structure(dataset.output_types,
                                           dataset.output_shapes)
next_element = iterator.get_next()

training_init_op = iterator.make_initializer(dataset)

for _ in range(2):
  # Initialize an iterator over the training dataset.
  sess.run(training_init_op)
  for _ in range(3):
    ne = sess.run(next_element)
    print(ne)
...