Большой набор данных HDF5, как эффективно перемешивать после каждой эпохи

В настоящее время я работаю с большим набором данных изображений (~ 60 ГБ), чтобы обучить CNN (Keras / Tensorflow) простой задаче классификации. Изображения представляют собой видеокадры и, таким образом, сильно коррелированы во времени, поэтому я перетасовал данные уже один раз при создании огромного файла .hdf5 ... Чтобы передать данные в CNN без необходимости загружать весь набор сразу в память, я написал простой пакетный генератор (см. код ниже). Теперь мой вопрос: обычно рекомендуется перемешивать данные после каждой эпохи обучения, верно? (по причинам сходимости SGD?) Но для этого мне пришлось бы загружать весь набор данных после каждой эпохи и перемешивать его, а именно этого я хотел избежать использования пакетного генератора ... Итак: действительно ли так важно перетасовать набор данных после каждой эпохи, и если да, то как я могу сделать это максимально эффективно? Вот текущий код моего пакетного генератора:

def generate_batches_from_hdf5_file(hdf5_file, batch_size, dimensions, num_classes):
"""
Generator that returns batches of images ('xs') and labels ('ys') from a h5 file.
"""
filesize = len(hdf5_file['labels'])

while 1:
    # count how many entries we have read
    n_entries = 0
    # as long as we haven't read all entries from the file: keep reading
    while n_entries < (filesize - batch_size):
        # start the next batch at index 0
        # create numpy arrays of input data (features)
        xs = hdf5_file['images'][n_entries: n_entries + batch_size]
        xs = np.reshape(xs, dimensions).astype('float32')

        # and label info. Contains more than one label in my case, e.g. is_dog, is_cat, fur_color,...
        y_values = hdf5_file['labels'][n_entries:n_entries + batch_size]
        #ys = keras.utils.to_categorical(y_values, num_classes)
        ys = to_categorical(y_values, num_classes)

        # we have read one more batch from this file
        n_entries += batch_size
        yield (xs, ys)

person nkaenzig    schedule 05.10.2017    source источник
comment
Просто важный аспект для скорости - установить chuck_size в вашем файле hdf5 в соответствии с размером вашего изображения. Это повышает эффективность при получении отдельных изображений с hdf5.   -  person Daniel GL    schedule 05.10.2017


Ответы (1)


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

Не перемешивайте данные целиком. Создайте список индексов в данных и перемешайте их вместо этого. Затем последовательно перемещайтесь по списку индексов и используйте его значения для выбора данных из набора данных.

person alkanen    schedule 10.02.2018