Я могу подтвердить, что мне нужна была эта модификация, чтобы заставить ее работать.

траиваю конвейер TensorFlow для чтения больших файлов HDF5 в качестве входных данных для моих моделей глубокого обучения. Каждый файл HDF5 содержит 100 видеороликов переменной длины, которые хранятся в виде коллекции сжатых изображений JPG (для управления размером на диске). С помощьюtf.data.Dataset и карта дляtf.py_funcчитать примеры из файла HDF5 с помощью пользовательской логики Python довольно просто. Например:

def read_examples_hdf5(filename, label):
    with h5py.File(filename, 'r') as hf:
        # read frames from HDF5 and decode them from JPG
    return frames, label

filenames = glob.glob(os.path.join(hdf5_data_path, "*.h5"))
labels = [0]*len(filenames) # ... can we do this more elegantly?

dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(
    lambda filename, label: tuple(tf.py_func(
        read_examples_hdf5, [filename, label], [tf.uint8, tf.int64]))
)

dataset = dataset.shuffle(1000 + 3 * BATCH_SIZE)
dataset = dataset.batch(BATCH_SIZE)
iterator = dataset.make_one_shot_iterator()
next_batch = iterator.get_next()

Этот пример работает, однако проблема в том, что кажется,tf.py_func может обрабатывать только один пример за один раз. Поскольку в моем контейнере HDF5 хранится 100 примеров, это ограничение вызывает значительные накладные расходы, поскольку файлы постоянно нужно открывать, читать, закрывать и открывать заново. Было бы намного эффективнее прочитать все 100 примеров видео в объекте набора данных и затем перейти к следующему файлу HDF5 (предпочтительно в нескольких потоках, каждый поток имеет свою собственную коллекцию файлов HDF5).

Итак, я хотел бы, чтобы несколько потоков работали в фоновом режиме, читая видеокадры из файлов HDF5, декодировали их из JPG и затем передавали их в объект набора данных. До введенияtf.data.Dataset трубопровод, это было довольно легко, используяRandomShuffleQueue а такжеenqueue_many ops, но кажется, что в настоящее время нет элегантного способа сделать это (или документация отсутствует).

Кто-нибудь знает, что будет лучшим способом достижения моей цели? Я также изучил (и реализовал) конвейер, используяtfrecord файлы, но беря случайную выборку видеокадров, хранящихся вtfrecord файл кажется совершенно невозможным (см.Вот). Кроме того, я посмотрел наfrom_generator() входы дляtf.data.Dataset но это определенно не будет работать в нескольких потоках, кажется. Любые предложения приветствуются.

Ответы на вопрос(2)

Ваш ответ на вопрос