如何在Python中找到MemoryError的源?
我正在用Hyperopt对神经网络进行超参数优化。这样做时,经过一些迭代之后,我得到了一个MemoryError异常 到目前为止,我尝试在使用完所有变量后清除它们(为它们分配无或空列表,有更好的方法吗?),并打印所有的local()、dirs()和globals(),以及它们的大小,但这些计数从未增加,而且大小非常小 结构如下所示:如何在Python中找到MemoryError的源?,python,hyperopt,Python,Hyperopt,我正在用Hyperopt对神经网络进行超参数优化。这样做时,经过一些迭代之后,我得到了一个MemoryError异常 到目前为止,我尝试在使用完所有变量后清除它们(为它们分配无或空列表,有更好的方法吗?),并打印所有的local()、dirs()和globals(),以及它们的大小,但这些计数从未增加,而且大小非常小 结构如下所示: return {'loss': -acc, 'status': STATUS_OK, 'model': model} def创建_模型(参数): ##从临时文件加
return {'loss': -acc, 'status': STATUS_OK, 'model': model}
def创建_模型(参数):
##从临时文件加载数据
##相应地预处理数据
##每次使用交叉验证清除Keras会话训练NN
##保存统计数据并清除所有变量(为其分配无或空列表)
def Optimize():
对于模型中的模型:#我有多个模型
##加载数据
##将数据保存到临时文件
审判
最佳运行=fmin(创建模型,
空间
algo=tpe.suggest,
最大值=100,
审判=审判)
在X次迭代之后(有时它会完成第一个100次,然后转移到第二个模型),它会抛出一个内存错误。
我的猜测是,一些变量仍保留在内存中,我没有清除它们,但我无法检测到它们
编辑:
Traceback (most recent call last):
File "Main.py", line 32, in <module>
optimal = Optimize(training_sets)
File "/home/User1/Optimizer/optimization2.py", line 394, in Optimize
trials=trials)
File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 307, in fmin
return_argmin=return_argmin,
File "/usr/local/lib/python3.5/dist-packages/hyperopt/base.py", line 635, in fmin
return_argmin=return_argmin)
File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 320, in fmin
rval.exhaust()
File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 199, in exhaust
self.run(self.max_evals - n_done, block_until_done=self.async)
File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 173, in run
self.serial_evaluate()
File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 92, in serial_evaluate
result = self.domain.evaluate(spec, ctrl)
File "/usr/local/lib/python3.5/dist-packages/hyperopt/base.py", line 840, in evaluate
rval = self.fn(pyll_rval)
File "/home/User1/Optimizer/optimization2.py", line 184, in create_model
x_train, x_test = x[train_indices], x[val_indices]
MemoryError
回溯(最近一次呼叫最后一次):
文件“Main.py”,第32行,在
优化=优化(训练集)
文件“/home/User1/Optimizer/optimization2.py”,第394行,在优化中
审判=审判)
文件“/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py”,第307行,在fmin中
return\u argmin=return\u argmin,
fmin中的文件“/usr/local/lib/python3.5/dist packages/hyperopt/base.py”,第635行
return\u argmin=return\u argmin)
文件“/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py”,第320行,在fmin中
右排气
文件“/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py”,第199行,在排气管中
self.run(self.max\u evals-n\u done,block\u直到\u done=self.async)
文件“/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py”,第173行,运行中
self.serial_evaluate()
文件“/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py”,第92行,以串行形式
结果=self.domain.evaluate(spec,ctrl)
文件“/usr/local/lib/python3.5/dist-packages/hyperopt/base.py”,第840行,在evaluate中
rval=self.fn(pyll\u rval)
文件“/home/User1/Optimizer/optimization2.py”,第184行,在create\u模型中
x_列,x_测试=x[列指数],x[值指数]
记忆者
我花了几天的时间才弄明白这一点,所以我将回答自己的问题,以节省遇到此问题的人的时间
通常,在对Keras使用Hyperopt时,建议的create_model
函数的return
如下所示:
return {'loss': -acc, 'status': STATUS_OK, 'model': model}
但是在大型模型中,有许多评估,您不想返回每个模型并将其保存在内存中,您所需要的只是一组超参数,这些超参数提供了最低的损失
通过简单地从返回的dict中删除模型,解决了每次求值时内存增加的问题
return {'loss': -acc, 'status': STATUS_OK}
你能把这个错误和完整的堆栈跟踪一起添加到你的问题中吗?让我重新运行它,我会提取出来。@AlexJadczak,这很有用。我使用了
memory\u profiler
,90%的内存是在调用fmin