Keras的ImageDataGenerator.flow()中的内存泄漏

时间:2018-07-09 06:08:57

标签: tensorflow machine-learning keras deep-learning

我有不适合内存的大数据集,因此,我将其分为几部分。我正在训练,一次加载一个零件,然后使用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。
如何解决这个问题?谢谢。

2 个答案:

答案 0 :(得分:0)

这是因为ImageDataGenerator。不管batch_size参数如何,flow()都会将所有数据加载到内存中。您必须将数据分批输入到flow()中。

答案 1 :(得分:0)

首先import gc

gc.collect()之后添加datagen.flow(X,y)

这意味着您每次致电datagen.flow(X,y)之后,都要收集垃圾。