TensorFlow - tf.data.Dataset lendo grandes arquivos HDF5

Estou configurando um pipeline TensorFlow para ler grandes arquivos HDF5 como entrada para meus modelos de aprendizado profundo. Cada arquivo HDF5 contém 100 vídeos de tamanho variável armazenados como uma coleção de imagens JPG compactadas (para tornar o tamanho do disco gerenciável). Usandotf.data.Dataset e um mapa paratf.py_func, ler exemplos do arquivo HDF5 usando a lógica Python personalizada é bastante fácil. Por exemplo:

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()

Este exemplo funciona, no entanto, o problema é que parecetf.py_func pode lidar apenas com um exemplo de cada vez. Como meu contêiner HDF5 armazena 100 exemplos, essa limitação causa uma sobrecarga significativa, pois os arquivos precisam constantemente ser abertos, lidos, fechados e reabertos. Seria muito mais eficiente ler todos os 100 exemplos de vídeo no objeto do conjunto de dados e seguir em frente com o próximo arquivo HDF5 (de preferência em vários threads, cada segmento lidando com sua própria coleção de arquivos HDF5).

Então, o que eu gostaria é de um número de threads em execução em segundo plano, lendo quadros de vídeo dos arquivos HDF5, decodificando-os em JPG e depois alimentando-os no objeto do conjunto de dados. Antes da introdução dotf.data.Dataset gasoduto, isso foi bastante fácil usando oRandomShuffleQueue eenqueue_many operações, mas parece que atualmente não há uma maneira elegante de fazer isso (ou a documentação está faltando).

Alguém sabe qual seria a melhor maneira de alcançar meu objetivo? Também examinei (e implementei) o pipeline usandotfrecord arquivos, mas obtendo uma amostra aleatória de quadros de vídeo armazenados em umtfrecord parece bastante impossível (consulteaqui) Além disso, eu olhei para ofrom_generator() entradas paratf.data.Dataset mas isso definitivamente não será executado em vários threads, ao que parece. Todas as sugestões são bem-vindas.

questionAnswers(2)

yourAnswerToTheQuestion