Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建模型后清除python循环中的内存_Python_Tensorflow_Machine Learning_Memory_Gpflow - Fatal编程技术网

创建模型后清除python循环中的内存

创建模型后清除python循环中的内存,python,tensorflow,machine-learning,memory,gpflow,Python,Tensorflow,Machine Learning,Memory,Gpflow,我在python中运行一个for循环,每个循环都需要在不同的数据上创建一个模型(下面显示了一个摘录)。每次创建的模型都不会从内存中删除,从而减慢每个循环的速度 import gc for s in range(0, 5): X, Y = get_data() m = make_dgp_model(X, Y, Z_100, L) del m gc.collect() print('memory: {}'.format(resource.getrusage(resource.RU

我在python中运行一个for循环,每个循环都需要在不同的数据上创建一个模型(下面显示了一个摘录)。每次创建的模型都不会从内存中删除,从而减慢每个循环的速度

import gc
for s in range(0, 5):
  X, Y = get_data()
  m = make_dgp_model(X, Y, Z_100, L)
  del m
  gc.collect()
  print('memory: {}'.format(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000000))
tf.reset_default_graph()
graph = tf.get_default_graph()
gpflow.reset_default_session(graph=graph)
给出输出:

memory: 460.025856
memory: 470.310912
memory: 486.764544
memory: 493.457408
memory: 499.523584

我知道python使用指针引用作为其内存,并且在重用变量时不会重写内存中的内容。出于这个原因,我尝试了delm,然后使用了垃圾收集器。这似乎不起作用。我做错什么了吗?循环完成后,是否有一种方法可以完全删除
m
中存储的内容?

我解决此问题的方法是添加以下内容,以便在每个循环中重置图形

import gc
for s in range(0, 5):
  X, Y = get_data()
  m = make_dgp_model(X, Y, Z_100, L)
  del m
  gc.collect()
  print('memory: {}'.format(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000000))
tf.reset_default_graph()
graph = tf.get_default_graph()
gpflow.reset_default_session(graph=graph)

如github问题所示(见最后一条评论)

GPflow的自述页面有一个链接,指向尼斯提示和技巧笔记本。您可以在第一项中找到问题的答案:)


为什么要在Python中处理内存使用?这不是你应该担心的事情。由于内存的增加,每个循环都会显著减慢。为什么要这样做呢?也许你应该展示一些代码,并解释X,Y,Z_100和L是什么。我想你可以重新初始化每个循环的权重,而不是创建一个新的模型?这应该会在没有内存泄漏的情况下得到相同的结果。如果您没有使用渴望模式,那么您可能正在向图中添加模型的新版本。即使您
delm
,图形及其操作仍将存在。如果您自己还没有创建图形,那么图形将被指定为
tf.get\u default\u graph()
,您可以用
tf.reset\u default\u graph()
清除它(用新的空图形替换)。这有一个内置的实用程序函数:
gpflow.reset\u default\u graph\u和\u session()
@STJ。你知道Pytork中是否有类似的功能,但我在Pytork中遇到了相同的问题。此链接已失效