Я могу подтвердить, что мне нужна была эта модификация, чтобы заставить ее работать.
траиваю конвейер 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
но это определенно не будет работать в нескольких потоках, кажется. Любые предложения приветствуются.