Python 如何使用K.clear_session()修复Keras中的内存泄漏问题?

Python 如何使用K.clear_session()修复Keras中的内存泄漏问题?,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个网络,我正在通过批量输入数据进行训练,我正在使用model.train\u on\u batch()来完成这项工作。如果我只运行这个训练部分,我看到我的网络训练在40多个历元(到目前为止)中的RAM利用率为3%,并且每个历元大约有2000次迭代。当我尝试在每个历元之后进行验证时(这也会成批发生),会出现非常严重的内存泄漏,导致90%的RAM利用率,并导致我的代码被杀死。在过去的几天里,我尝试了一些方法,似乎循环中的model.predict()会导致内存泄漏。我试着在批处理()上预测,同

我有一个网络,我正在通过批量输入数据进行训练,我正在使用
model.train\u on\u batch()
来完成这项工作。如果我只运行这个训练部分,我看到我的网络训练在40多个历元(到目前为止)中的RAM利用率为3%,并且每个历元大约有2000次迭代。当我尝试在每个历元之后进行验证时(这也会成批发生),会出现非常严重的内存泄漏,导致90%的RAM利用率,并导致我的代码被杀死。在过去的几天里,我尝试了一些方法,似乎循环中的
model.predict()
会导致内存泄漏。我试着在批处理()上预测,同样的行为
model(inputs,training=False)
似乎减缓了内存泄漏,而不是从3%-7%-13%-40%-80%-90%(间隔60秒)的突然跳跃,它每分钟增加1%。但在某一点上,它也达到了90%。我唯一可以尝试使用这个github线程的方法就是使用
K.clear\u session()

我试着阅读
K.clear_session()
和一些SO帖子的文档,所有这些帖子都建议在创建多个模型时使用它,而我没有这样做。所以我的问题是,如果我有一个模型在循环中进行训练和评估,我应该在每个历元之后在哪里使用
K.clear_session()
,并在每个历元之前重新加载保存的模型?对吗

除此之外,我还得到了拓扑排序错误,所以我想知道这是否是因为我在循环中训练,因为我的代码没有循环,这也会导致内存泄漏,
K.clear\u session()
会有帮助吗

我的代码结构的最小示例:

from tensorflow.keras.models import Model
K = tf.keras.backend

def myModel():
    **some architecture**

ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mean_squared_error)

for e in range(numEpochs):
    for batch in range(0, num_train_batches):
        x = readImages()
        y = readLabels()
        loss = model.train_on_batch(x, y)
        

    for batch in range(0, num_val_batches):
        x = readImages()
        y = model.predict(x)
        val_loss = K.get_value(custom_mean_squared_error(x,y))
        # save predictions

# plot training vs validation loss

Tensorflow-gpu-1.14,python3.6。如果我做错了什么,我也会很感激你的建议。

这对我来说似乎很有效,但会使过程变慢:

from tensorflow.keras.models import Model
K = tf.keras.backend

def myModel():
    **some architecture**

ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mse)

for e in range(numEpochs):
    for batch in range(0, num_train_batches):
        x = readImages()
        y = readLabels()
        # define appropriate flags for first loop
        model = tf.keras.models.load_model(model_path,custom_objects={ 'custom_mse': custom_mse } )
        loss = model.train_on_batch(x, y)

    model.save(model_path)

    for batch in range(0, num_val_batches):
        x = readImages()
        model = tf.keras.models.load_model(model_path,custom_objects={ 'custom_mse': custom_mse } )
        y = model.predict(x)
        K.clear_session()
        val_loss = K.get_value(custom_mean_squared_error(x,y))
        # save predictions

# plot training vs validation loss