Как работать с двумя разными генераторами при подаче ввода в нейронную сеть в керасе? - PullRequest
0 голосов
/ 04 июня 2019

У меня огромный набор данных.Мой обычный подход, когда я имею дело с таким набором данных, состоит в том, чтобы разделить на несколько крошечных наборов данных с использованием бесчисленных архивов и использовать генератор для их обработки.Есть ли другие альтернативы этому?Я также хотел включить произвольные дополнения изображений во время выполнения с модулем предварительной обработки Keras Image, который также является функцией типа генератора.Как мне организовать потоковую передачу этих двух процессов генератора?Ссылка на модуль увеличения изображения Keras приведена ниже.https://keras.io/preprocessing/image/

Мой текущий генератор данных работает следующим образом:

def dat_loader(path, batch_size):
    while True:
        for dir, subdir, files in os.walk(path):
            for file in files:
                file_path = path + file
                archive = np.load(file_path)
                img = archive['images']
                truth = archive['truth']
                del archive
                num_batches = len(truth)//batch_size
                img = np.array_split(img, num_batches)
                truth = np.array_split(truth, num_batches)
                while truth:
                    batch_img = img.pop()
                    batch_truth = truth.pop()
                    yield batch_img, batch_truth

1 Ответ

1 голос
/ 04 июня 2019

Одним из способов обработки действительно больших наборов данных является использование отображенных в память файлов , которые динамически загружают необходимые данные во время выполнения. NumPy имеет memmap , который создает массив, который сопоставляется с большим файлом, который может быть массивным (у меня когда-то был один для предварительно обработанной версии офлайн-Википедии, и это было нормально), но он не обязательно живет в вашем БАРАН. Любые изменения сбрасываются обратно в файл при необходимости или при сборе мусора. Вот пример:

import numpy as np
# Create or load a memory mapped array, can contain your huge dataset
nrows, ncols = 1000000, 100
f = np.memmap('memmapped.dat', dtype=np.float32,
              mode='w+', shape=(nrows, ncols))

# Use it like a normal array but it will be slower as it might
# access the disk along the way.
for i in range(ncols):
    f[:, i] = np.random.rand(nrows)

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

...