Как прочитать все записи примера из файла TFRecord за один раз, используя API набора данных?

Я использую задание Spark для создания файла TFRecord, который будет моим словарным файлом пар (слово, количество).

Я хочу загрузить весь файл сразу, используя API набора данных, поскольку мой файл со словарем может находиться в HDFS и может быть разделен на несколько физических файлов. Тем не менее, я нахожу это довольно неинтуитивным. Вот мой код:

def parse(example):
    parsed = tf.parse_single_example(example, features={
        'token': tf.FixedLenFeature([], dtype=tf.string),
        'count': tf.FixedLenFeature([], dtype=tf.int64)
    })
    return parsed['token'], parsed['count']

filenames = tf.gfile.Glob(filenames)
dataset   = tf.data.TFRecordDataset(filenames)
dataset   = dataset.map(parse)
dataset   = dataset.batch(MAX_VOCAB_FILE)
iterator  = dataset.make_one_shot_iterator()

token, token_count = iterator.get_next()

Использование огромного, фиксированного предварительного размера пакета — это единственный способ, которым я могу думать о том, чтобы получить все данные сразу в тензоре shape=(num_entries,). Кажется, он работает довольно медленно.

Есть ли способ лучше?


person Ian Hummel    schedule 20.12.2017    source источник


Ответы (1)


Однажды мне пришлось сделать что-то подобное. Это не интуитивно понятно, но в документации по TF есть ответ по импорту данных.

Чтобы облегчить понимание моего решения, я предполагаю, что ваш код заключен в метод с именем get_batch:

def get_batch(filenames, batch_size):
    # your code
    return token, token_count

где аргумент batch_size заменяет MAX_VOCAB_FILE в вашем примере. Если вы хотите вывести все последовательные пары (token, token_count) в стандартный вывод, по одной строке за раз, вы должны сделать это:

with tf.Session() as sess:
    example = get_batch(filenames, 1)
    while True:
        print(sess.run(example))

Затем итератор исчерпан, цикл завершается с OutOfRangeError. Каждая испускаемая запись представляет собой пару тензоров, преобразованных в пустые объекты.

Надеюсь, этого достаточно, чтобы сделать что-то полезное.

person Jerry    schedule 13.01.2018