Загрузка больших данных в TensorFlow 2.0 без загрузки их в оперативную память - PullRequest
0 голосов
/ 13 июня 2019

Я обработал и сохранил большой набор данных видео- и аудиофайлов (примерно от 8 до 9 ГБ данных). Данные сохраняются в виде 2-х отдельных массивов, по одному для каждой модальности. Формы файлов:

Я хочу использовать эти данные для обучения своей нейронной сети для задачи классификации. Я использую бета-версию TensorFlow 2.0. Я запускаю все коды в Google Colab (после установки бета-версии tf-2.0) Каждый раз при загрузкеданные в tf.data используются во всей оперативной памяти виртуальной машины, и сеанс принудительно перезапускается.

Предыдущие подходы:

Я пробовал 2 подхода

1)Загрузка обеих переменных полностью в ОЗУ и преобразование их в тензоры

2) Загрузка данных в виде отображенного в память массива (с диска) и загрузка их в tf.data

Однако оба подхода загрузилиОЗУ и принудительная перезагрузка виртуальной машиныле RAM

1 Ответ

0 голосов
/ 13 июня 2019

Вам, вероятно, следует использовать формат файла HDF5, который является хорошим способом хранения многомерных массивов на жестком диске.В частности, я рекомендую вам использовать пакет h5py, который обеспечивает плавный интерфейс для использования файлов HDF5 в Python.

Теперь я не использовал TensorFlow 2, но в TF1 мы могли бы создать набор данных TensorFlowобъекты из генератора Python.Ниже у нас есть генератор, который будет загружать файл HDF5 и извлекать случайный элемент из массива (вдоль первой оси).

import h5py
import random

def iterate_dataset(dataset_file, dataset_name):
    h5 = h5py.File(dataset_file, 'r')
    idxs = range(len(h5[dataset_name]))
    random.shuffle(idxs)

    for i in idxs:
        yield h5[dataset_name][i]
    h5.close()

Вот также код для сохранения ваших массивов в виде файла HDF5

import h5py

def save_array(arr, dataset_file, dataset_name, compress=True)
    with h5py.File(dataset_file, 'a') as h5:
        if compress:
            dataset = h5.create_dataset(
                dataset_name,
                data=arr,
                chunks=(1, *arr.shape[1:]),
                compression='lzf'
            )
            return
        h5[dataset_name] = arr

save_array(data1, 'filename.hdf5', 'data1')
save_array(data2, 'filename.hdf5', 'data2')

Наконец, могут быть некоторые ошибки кода, поэтому я перечитал, как только я на моем компьютере.

...