在单个文件中保存大量 numpy 数组并使用它来拟合 keras 模型
Save large amount of numpy arrays in single file and use it to fit keras model
我有大量不适合 RAM 的 numpy 数组。让我们说数百万:
np.arange(10)
- 我想将它们逐块保存在文件系统中的单个文件中。
- 我想从文件中读取它们并使用
model.fit_generator
将它们提供给我的 keras 模型
我阅读了有关 dask 的文章,它可以处理不适合内存但无法实现我的目标的大数据。
使用 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)
我有大量不适合 RAM 的 numpy 数组。让我们说数百万:
np.arange(10)
- 我想将它们逐块保存在文件系统中的单个文件中。
- 我想从文件中读取它们并使用
model.fit_generator
将它们提供给我的 keras 模型
我阅读了有关 dask 的文章,它可以处理不适合内存但无法实现我的目标的大数据。
使用 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)