2016-11-28 12 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回の反復の後、最初の呼び出しでは10秒間にほぼ5分かかりました。 私が走っているモデルは形状とサイズが似ているので、問題はありません。同じモデルを最初に生成した場合、または10回の反復後に生成すると、10回の反復後にはるかに長くなります。

これはどこから来るのか、それを避ける方法を知っていますか(5回の反復ごとにPythonを再起動する必要はありません)。 GTX650Ti(1Go内部メモリ)のテンソルフローバックエンドで、これをIPythonで実行します。 私のRAM消費量はゆっくりと増えています(通話では50〜100Mo)。

+0

ない頭に浮かぶ 'keras'、しかし最初に精通ジェネレータがメモリを消費することが少なく、呼び出されたときにのみアクティブであるため、 'return'を' yield 'に置き換えることです。 –

答えて

1

すべてのモデルはデフォルトのTFグラフで作成されますが、これは時間とともに大きくなります。

ソリューションは、グラフの範囲内のモデルを作成するか、またはデフォルトのグラフをクリアするには、次のKerasユーティリティを使用することです:

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

上書きしても大きくなりますか? (私の場合と同じように、私は常に 'model'変数を上書きします) – CoMartel

+0

はい、Kerasは単一のデフォルトのtfグラフを使用します。 –

+0

は完璧に動作します、ありがとう! – CoMartel

関連する問題