#numpy #machine-learning #keras #hdf5 #numpy-ndarray
#numpy #машинное обучение #keras #hdf5 #numpy-ndarray
Вопрос:
У меня огромное количество массивов numpy, которые не помещаются в оперативную память. Допустим, миллионы:
np.arange(10)
- Я хочу сохранить их в файловой системе в одном файле, фрагмент за фрагментом.
- Я хочу прочитать их из файла и передать в мою модель keras с помощью
model.fit_generator
Я читал о dask, который работает с большими данными, которые не помещаются в память, но не смог достичь своих целей.
Комментарии:
1. Все одинакового размера или отличаются?
2. Рассматривали ли вы файл HDF5 с модулем h5py или pytables?
3. @hpaulj все массивы numpy представляют изображения размером 224x224x3, поэтому их размер должен быть одинаковым @ kcw78, сначала я рассматривал возможность использования numpy.savez_compressed, но увидел, что у него нет метода добавления — я планирую поместить все массивы в один файл. Сейчас я смотрю на hdf5
Ответ №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)
Комментарии:
1. Вы можете использовать любую serlialization, какую захотите, это на самом деле не меняет, как это сделать. Pickle выполняется достаточно быстро, имхо
2. Я удалил свой комментарий, извините, не заметил вашего ответа. Мой вопрос был «достаточно ли быстро выполняется pickle», а выше приведен ответ @ixeption
3. Пожалуйста, примите ответы, если вы считаете, что ответ правильный