2016-11-28 94 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