Тензор потока: имеет значение последовательность при кодировании и декодировании TFRecord

krishnab спросил: 07 октября 2018 в 12:16 в: python

У меня есть некоторые тренировочные данные, которые я хочу кодировать в формат TFRecord, а затем декодировать в tf.features в Tensorflow. Мой вопрос очень простой, но я не смог найти четкого ответа на этот вопрос.

Вопрос: нужно ли декодировать объекты в наборе данных в той же последовательности, в которой они находятся закодированы? Другими словами, я не могу найти способ ссылаться на объекты по имени поля в TFRecord. Это действительно важно по двум причинам.

  1. Я просто хотел проверить свое предположение, чтобы я знал, как избежать взлома моего кода в будущем. Вот простой код, хотя это и не полный пример.
  2. Python много говорит о том, что словари не упорядочены . Итак, как я могу гарантировать последовательность, когда я использую структуру данных, которая должна быть неупорядоченной? Я не был уверен, обрабатывалось ли это каким-то образом, о котором я не знаю.

Чтобы закодировать данные в формат TFRecord, вы можете сделать что-то вроде:

#Fields in Dataframe: ['DIVISION','SPORDER','PUMA','REGION']df = pd.DataFrame(...)
with tf.python_io.TFRecordWriter('myfile.tfrecord') as writer:    for row in df.itertuples():
        example = tf.train.Example(features=tf.train.Features(feature={
          'feat/division': tf.train.Feature(int64_list=tf.train.Int64List(value=row.DIVISION)),
          'label/sporder': tf.train.Feature(int64_list=tf.train.Int64List(value=row.SPORDER)),
          'feat/puma': tf.train.Feature(bytes_list=tf.train.BytesList(value=[row.PUMA])),
          'feat/region': tf.train.Feature(bytes_list=tf.train.BytesList(value=[row.REGION]))))
        writer.write(example.SerializeToString())

Тогда для загрузки набора данных вам понадобится что-то вроде приведенного ниже кода. Обратите внимание, что на поля снова ссылаются по порядку. ПРИМЕЧАНИЕ: я использовал те же ключи словаря в TFRecords в сравнении с декодированной формой, но я не думаю, что это необходимо - просто удобство. Я не был уверен, так ли это должно быть? Значение

dataset = tf.data.TFRecordDataset('myfile.tfrecord')
dataset = dataset.map(_parse_function)def _parse_function(example_proto):
    features = {'feat/division': tf.FixedLenFeature((), tf.string, default_value=""),
                'label/sporder': tf.FixedLenFeature((), tf.int64, default_value=0),
                'feat/puma': tf.VarLenFeature(dtype=tf.string),
                'feat/region': tf.VarLenFeature(dtype=tf.string)}    parsed_example = tf.parse_single_example(example_proto, features)
    parsed_label = parsed_example.pop("label/sporder", None)    return parsed_example, parsed_label

0 ответов