2016-11-28 95 views
3

我用这个功能来生成keras型号:生成模式变得越来越长

def nn_model(n1,n2=None,n3=None): 
    model = Sequential() 
    model.add(Dense(n1, input_dim=len(features), init='he_normal')) 
    model.add(PReLU()) 
    if n2 != None: 
     model.add(Dense(n2, init = 'he_normal')) 
     model.add(PReLU()) 
    if n3 != None: 
     model.add(Dense(n3, init = 'he_normal')) 
     model.add(PReLU()) 
    model.add(Dense(1, init='he_normal')) 
    model.compile(loss='mae', optimizer='adadelta') 
    return(model) 

运行它的代码:

N1 = [10,9,8,7,6] 
N2 = [8, 7, 6, 5, 4, 3, None] 
N3 = [6, 5, 4, 3, 2, None] 
test_list = [item for item in product(N1,N2,N3) if sorted(item, reverse = True) == list(item)][start_index:] 
for m,(n1,n2,n3) in enumerate(test_list): 
    model = nn_model(n1,n2,n3) 
    # fit model and predict 

它工作正常,但每次我叫它,它得到较慢的速度返回编译后的模型。如果我重新启动Python,我会再次像平常一样工作,但每次迭代后都会变慢。经过30次迭代后,差不多需要5分钟,而第一次通话需要10秒。 我运行的模型在形状和尺寸上相似,所以这不是问题。如果我先生成相同的模型或者经过10次迭代后生成相同的模型,那么经过10次迭代后将会更长。

有谁知道这可能来自哪里以及如何避免它(无需重新启动python每5次迭代)。 我在IPython,GTX650Ti(1Go内部存储器)上的tensorflow后端运行此操作。 它也值得注意我的内存消耗量缓慢增长(约50-100Mo通话)。

+0

不熟悉'keras',想到的不过第一件事可能会用'yield'替换'return',因为生成器消耗的内存要少得多,而且只有在调用时才会激活。 –

回答

1

所有模型都在默认的TF图中创建,该图随着时间的推移而变大。

的解决方案是创建模型的图表范围内,或使用以下Keras工具来清除默认图:

from keras import backend as K 
K.clear_session() 
+0

即使覆盖它也会变大? (就像我的情况一样,我总是覆盖'model'变量) – CoMartel

+0

是的,因为Keras使用内部单个默认tf图。 –

+0

完美作品,谢谢! – CoMartel