Python Keras:完成训练过程后释放记忆

Python Keras:完成训练过程后释放记忆,python,keras,Python,Keras,我使用Keras构建了一个基于CNN结构的自动编码器模型,在完成训练过程后,我的笔记本电脑有64GB的内存,但我注意到至少1/3的内存仍然被占用,GPU内存也是如此。我没有找到释放内存的好方法,我只能通过关闭Anaconda提示符命令窗口和jupyter笔记本来释放内存。我不确定是否有人有好的建议。谢谢 释放RAM存储器 要释放RAM内存,只需按照@nuric在注释中的建议执行delvariables 释放GPU内存 这比释放RAM内存要复杂一点。有些人会建议您使用以下代码(假设您正在使用ker

我使用Keras构建了一个基于CNN结构的自动编码器模型,在完成训练过程后,我的笔记本电脑有64GB的内存,但我注意到至少1/3的内存仍然被占用,GPU内存也是如此。我没有找到释放内存的好方法,我只能通过关闭Anaconda提示符命令窗口和jupyter笔记本来释放内存。我不确定是否有人有好的建议。谢谢

释放RAM存储器 要释放RAM内存,只需按照@nuric在注释中的建议执行
delvariables

释放GPU内存 这比释放RAM内存要复杂一点。有些人会建议您使用以下代码(假设您正在使用keras)

然而,上述代码并不适用于所有人。(即使您尝试
del Models
,它仍然不起作用)

如果上述方法不适用于您,请尝试以下方法(您需要先安装库):

其背后的原因是:Tensorflow只是将内存分配给GPU,而CUDA负责管理GPU内存


如果CUDA在您用
K.clear_session()
清除所有图形后以某种方式拒绝释放GPU内存,那么您可以使用CUDA库直接控制CUDA清除GPU内存。

要清除RAM内存,只需按照Raven的建议删除变量即可

但不幸的是,对于GPU
cuda.close()
将在涉及GPU的未来步骤(如模型评估)中抛出错误。释放GPU内存的一种解决方法是将模型创建和训练部分封装在函数中,然后使用子进程完成主要工作。培训完成后,子进程将终止,GPU内存将空闲

比如:

import multiprocessing

def create_model_and_train( ):
      .....
      .....

p = multiprocessing.Process(target=create_model_and_train)
p.start()
p.join()
或者,您可以创建以下函数并在每次运行之前调用它:

from keras.backend.tensorflow_backend import set_session
from keras.backend.tensorflow_backend import clear_session
from keras.backend.tensorflow_backend import get_session
import tensorflow
import gc

# Reset Keras Session
def reset_keras():
    sess = get_session()
    clear_session()
    sess.close()
    sess = get_session()

    try:
        del classifier # this is from global space - change this as you need
    except:
        pass

    print(gc.collect()) # if it does something you should see a number as output

    # use the same config as you used to create the session
    config = tensorflow.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1
    config.gpu_options.visible_device_list = "0"
    set_session(tensorflow.Session(config=config))

这个问题似乎与编程无关,而是消费者PC硬件或软件的问题,这与堆栈溢出无关。如果您在这个问题上仍然需要帮助,请向Stack Overflow的姐妹站点询问,它很可能是进程运行时占用内存的数据(jupyter内核)。您可以尝试
delmydata
从垃圾收集的范围中删除数据变量;但是没有代码就说不出来。谢谢你的建议,我试着用“del”删除加载的训练和测试成像数据,它可以释放大约3GB的内存,这部分解决了问题。谢谢你解释CUDA和Tensorflow内存管理之间的额外区别。我不知道这件事。
import multiprocessing

def create_model_and_train( ):
      .....
      .....

p = multiprocessing.Process(target=create_model_and_train)
p.start()
p.join()
from keras.backend.tensorflow_backend import set_session
from keras.backend.tensorflow_backend import clear_session
from keras.backend.tensorflow_backend import get_session
import tensorflow
import gc

# Reset Keras Session
def reset_keras():
    sess = get_session()
    clear_session()
    sess.close()
    sess = get_session()

    try:
        del classifier # this is from global space - change this as you need
    except:
        pass

    print(gc.collect()) # if it does something you should see a number as output

    # use the same config as you used to create the session
    config = tensorflow.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1
    config.gpu_options.visible_device_list = "0"
    set_session(tensorflow.Session(config=config))