首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras模型训练内存泄漏

Keras模型训练内存泄漏
EN

Stack Overflow用户
提问于 2019-09-27 15:42:28
回答 2查看 9K关注 0票数 6

我刚接触过Keras、Tensorflow、Python和我正试图为个人使用/未来的学习建立一个模型。我刚从python开始,我想出了这段代码(借助视频和教程)。我的问题是,随着每一个时代,甚至在构建新模型之后,我对Python的内存使用量都在缓慢上升。一旦内存达到100%,训练就在没有错误/警告的情况下停止。我不知道太多,但问题应该在循环的某个地方(如果我没有弄错的话)。我知道

k.clear.session()

但是,要么这个问题没有被删除,要么我不知道如何将它集成到我的代码中。我有:Pythonv3.6.4,Tensorflow 2.0.0rc1 (cpu版本),Keras 2.3.0

这是我的密码:

代码语言:javascript
复制
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))

另外,我也不知道是否可以在一个问题中问出两个问题(我不想在这里用我的问题来垃圾邮件,任何有蟒蛇经验的人都可以在一分钟内解决这个问题),但是我在检查点保存方面也有问题。我只想保存性能最好的模型(每1NN规范一个模型-节点/层数),但目前它保存在每个时代之后。如果这不合适,我可以提出另一个问题。

非常感谢您的帮助。

EN

回答 2

Stack Overflow用户

发布于 2019-09-27 16:18:15

问题的一个原因是,一个新的model = Sequential()循环并没有删除以前的模型;它仍然是在其TensorFlow图形范围内构建的,并且每个新的model = Sequential()都添加了另一个挥之不去的结构,最终导致内存溢出。为了确保模型被完全销毁,在完成模型后运行下面的命令:

代码语言:javascript
复制
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的垃圾收集模块,它清除了del之后遗留的model痕迹。K.clear_session()是主调用,并清除TensorFlow图。

此外,虽然您对模型检查点、日志记录和超参数搜索的想法很好,但它执行得非常糟糕;实际上,您将只测试您在那里设置的整个嵌套循环的一个超参数组合。但这应该在另一个问题中提出。

UPDATE:只是在一个完全正确的设置环境中遇到了同样的问题;最有可能的结论是,这是一个bug --一个明确的罪魁祸首是急于执行。若要工作,请使用

代码语言:javascript
复制
tf.compat.v1.disable_eager_execution() # right after `import tensorflow as tf`

切换到图形模式,这也可以运行significantly faster。还请参阅上面更新的清晰代码。

票数 8
EN

Stack Overflow用户

发布于 2020-01-16 17:02:54

这是个已知的窃听器。更新到Tensorflow 2.1应该可以解决这个问题。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58137677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档