web-dev-qa-db-ja.com

KERASモデルトレーニングメモリリーク

私はKeras、Tensorflow Python、個人的な使用/将来の学習のためのモデルを構築しようとしています。私はpythonから始めましたが、このコードを思い付きました(ビデオやチュートリアルの助けを借りて)。私の問題は、Pythonの私のメモリ使用量が各エポックでゆっくり忍び寄ることであり、新しいモデルを構築した後でさえもゆっくりと忍び寄ることです。メモリが100%になると、トレーニングはエラー/警告なしで停止するだけです。私はあまり知りませんが、問題はループ内のどこかにあるはずです(私が間違っていない場合)。私は知っています

k.Clear.Session()

しかし、問題が解決されなかったか、コードに統合する方法がわかりません。私は:Python V 3.6.4、Tensorflow 2.0.0RC1(CPU版)、Keras 2.3.0

これは私のコードです:

_import pandas as pd
import os
import time
import tensorflow as tf
import numpy as np
import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, BatchNormalization
from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint

EPOCHS = 25
BATCH_SIZE = 32           

df = pd.read_csv("EntryData.csv", names=['1SH5', '1SHA', '1SA5', '1SAA', '1WH5', '1WHA',
                                         '2SA5', '2SAA', '2SH5', '2SHA', '2WA5', '2WAA',
                                         '3R1', '3R2', '3R3', '3R4', '3R5', '3R6',
                                         'Target'])

df_val = 14554 

validation_df = df[df.index > df_val]
df = df[df.index <= df_val]

train_x = df.drop(columns=['Target'])
train_y = df[['Target']]
validation_x = validation_df.drop(columns=['Target'])
validation_y = validation_df[['Target']]

train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
validation_x = np.asarray(validation_x)
validation_y = np.asarray(validation_y)

train_x = train_x.reshape(train_x.shape[0], 1, train_x.shape[1])
validation_x = validation_x.reshape(validation_x.shape[0], 1, validation_x.shape[1])

dense_layers = [0, 1, 2]
layer_sizes = [32, 64, 128]
conv_layers = [1, 2, 3]

for dense_layer in dense_layers:
    for layer_size in layer_sizes:
        for conv_layer in conv_layers:
            NAME = "{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size, 
                    dense_layer, int(time.time()))
            tensorboard = TensorBoard(log_dir="logs\{}".format(NAME))
            print(NAME)

            model = Sequential()
            model.add(LSTM(layer_size, input_shape=(train_x.shape[1:]), 
                                       return_sequences=True))
            model.add(Dropout(0.2))
            model.add(BatchNormalization())

            for l in range(conv_layer-1):
                model.add(LSTM(layer_size, return_sequences=True))
                model.add(Dropout(0.1))
                model.add(BatchNormalization())

            for l in range(dense_layer):
                model.add(Dense(layer_size, activation='relu'))
                model.add(Dropout(0.2))

            model.add(Dense(2, activation='softmax'))

            opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

            # Compile model
            model.compile(loss='sparse_categorical_crossentropy',
                          optimizer=opt,
                          metrics=['accuracy'])

            # unique file name that will include the Epoch 
            # and the validation acc for that Epoch
            filepath = "RNN_Final.{Epoch:02d}-{val_accuracy:.3f}"  
            checkpoint = ModelCheckpoint("models\{}.model".format(filepath, 
                         monitor='val_acc', verbose=0, save_best_only=True, 
                         mode='max')) # saves only the best ones

            # Train model
            history = model.fit(
                train_x, train_y,
                batch_size=BATCH_SIZE,
                epochs=EPOCHS,
                validation_data=(validation_x, validation_y),
                callbacks=[tensorboard, checkpoint])

# Score model
score = model.evaluate(validation_x, validation_y, verbose=2)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# Save model
model.save("models\{}".format(NAME))
_

また、1つの質問内に2つの問題を尋ねることが可能かどうかわかりません(私は誰でもpython経験を持っている私の問題でそれをスパムしたくない)、1分以内に解決することができます)、しかし、私はチェックポイントの保存に問題もあります。私は最高の実行モデルのみを保存したいです(1 nnの仕様 - ノード/レイヤ数の1モデル)が、現在それはすべてのエポックの後に保存されます。これが尋ねるのが不適切な場合は、このために別の質問を作成できます。

助けてくれてありがとうございました。

4
Sly Shark

問題点の1つは、model = Sequential()の新しいループであることですNot前のモデルを削除します。それはそのテンソルフローグラフスコープ内に組み込まれています、そしてすべての新しいmodel = Sequential()は、最終的にメモリをオーバーフローする別のリンアップ構造を追加します。モデルが完全に完全に破壊されていることを確認するために、モデルで完了したら下に実行してください。

_import gc
del model
gc.collect()
K.clear_session()
tf.compat.v1.reset_default_graph() # TF graph isn't same as Keras graph
_

gcはPythonのガベージコレクションモジュールです。modelの後のdelの残りのトレースをクリアする。 K.clear_session()はメインコールであり、Tensorflowグラフをクリアします。

また、モデルチェックポイント、ロギング、およびハイパーパラメータ検索のアイデアがかなり音である間、それは非常に不適切に実行されます。実際にはテストのみがテストされます。 Oneそこに設定したLoop全体のためのハイパーパラメータの組み合わせ。しかし、これは別の質問で尋ねられるべきです。


[〜#〜]更新[〜#〜]:完全に正しく設定された環境で、同じ問題が発生したばかりです。最も好ましい結論は、それはバグです - そして明確な犯罪は熱心な実行。回避するために、使用する

_tf.compat.v1.disable_eager_execution() # right after `import tensorflow as tf`
_

グラフモードに切り替えるには、実行することもできます 大幅に速い 。上記の更新されたクリアコードも参照してください。

3