我有不适合内存的大数据集,因此,我将其分为几部分。我正在训练,一次加载一个零件,然后使用ImageDataGenerator应用图像增强。这样可以不断增加RAM在每个时期的使用率,最终内存被填满,内核死亡。
我的生成器代码:
def data_gen(N,bs):
#N=Number of pieces in which traning set is divided
#bs=batch_size
datagen = ImageDataGenerator(
rotation_range=180,
width_shift_range=0.1,
height_shift_range=0.1,
vertical_flip=True,
horizontal_flip=True,
zoom_range=0.2
)
while True:
print('Memory Status:')
printm()#It prints memory status
for n in range(N):
X,y=load_traning_data(n+1)# It loads one piece of traning data n+1 is file number.
datagen.fit(X)
batches=-1
for X_mini,y_mini in datagen.flow(X,y):
batches=batches+1
if batches >= len(X) / bs:
break
yield X_mini,y_mini
如果我不这样使用ImageDataGenerator:
def data_gen(N,bs):
#N=Number of pieces in which traning set is divided
#bs=batch_size
while True:
print('Memory Status:')
printm()#It prints memory status
for n in range(N):
X,y=load_traning_data(n+1)
for X_mini,y_mini in mini_batch(X,y): #mini_batch() generates mini_batches of X and y.
yield X_mini,y_mini
它工作正常。
此外,如果我仅加载一份训练数据并应用图像增强功能,则效果很好。因此,问题似乎在于将ImageDataGenerator安装在多个转换片段上。
模型装有fit_generator:
gen=data_gen(16,32) #16 peices of traning data and batch_size=32
model.fit_generator(gen,steps_per_epoch=8000/32,epochs=30)
我正在使用Googlecolab。
如何解决这个问题?谢谢。
答案 0 :(得分:0)
这是因为ImageDataGenerator。不管batch_size参数如何,flow()都会将所有数据加载到内存中。您必须将数据分批输入到flow()中。
答案 1 :(得分:0)
首先import gc
在gc.collect()
之后添加datagen.flow(X,y)
。
这意味着您每次致电datagen.flow(X,y)
之后,都要收集垃圾。