Сохраните большое количество массивов numpy в одном файле и используйте его для соответствия модели keras.

У меня огромное количество массивов numpy, которые не помещаются в ОЗУ. Скажем, миллионы:

np.arange(10) 
  1. Я хочу сохранить их в файловой системе в одном файле, по частям.
  2. Я хочу прочитать их из файла и передать их моей модели keras, используя model.fit_generator

Я читал о dask, который работает с большими данными, которые не помещаются в памяти, но не смог достичь моих целей.


person John    schedule 07.03.2019    source источник
comment
Все одного размера или разные?   -  person hpaulj    schedule 07.03.2019
comment
Рассматривали ли вы файл HDF5 с модулем h5py или pytables?   -  person kcw78    schedule 07.03.2019
comment
@hpaulj все массивы numpy представляют изображения 224x224x3, поэтому их размер должен быть одинаковым @ kcw78, я сначала подумал об использовании numpy.savez_compressed, но увидел, что у него нет метода добавления - я планирую поместить все массивы в один файл. Я сейчас смотрю на hdf5   -  person John    schedule 08.03.2019


Ответы (1)


Запишите файлы на диск с помощью pickle:

pickle.dump((x, y), open(file, "wb"), protocol=pickle.HIGHEST_PROTOCOL)

Затем создайте список тестовых и обучающих файлов и создайте генератор:

def raw_generator(files):
    while 1:      
        for file_num, file in enumerate(files):
            try:
                x, y = pickle.load(open(file, 'rb'))                   
                batches = int(np.ceil(len(y) / batch_size))
                for i in range(0, batches):                        
                    end = min(len(x), i * batch_size + batch_size)
                    yield x[i * batch_size:end], y[i * batch_size:end]

            except EOFError:
                print("error" + file)

train_gen = preprocessing.generator(training_files)
test_gen = preprocessing.generator(test_files)

Наконец вызовите fit_generator:

history = model.fit_generator(
                generator=train_gen,
                steps_per_epoch= (len(training_files)*data_per_file)/batch_size,
                epochs=epochs
                validation_data=test_gen,
                validation_steps=(len(test_files)*data_per_file)/batch_size,        
                use_multiprocessing=False,
                max_queue_size=10,
                workers=1,
                verbose=1)
person ixeption    schedule 07.03.2019
comment
Вы можете использовать любую сериализацию, которую хотите, это не меняет того, как это сделать. Пикл достаточно быстрый имхо - person ixeption; 08.03.2019
comment
Я удалил свой комментарий, извините, не заметил вашего ответа. Мой вопрос был достаточно быстрым, и выше был ответ @ixeption - person John; 08.03.2019
comment
Пожалуйста, примите ответы, если считаете, что ответ правильный - person ixeption; 08.03.2019