Я запускаю оптимизацию гиперпараметров, используя Hyperopt для нейронной сети. При этом после некоторых итераций я получаю исключение MemoryError
До сих пор я пытался очистить все переменные после того, как они были использованы (назначив им None или пустые списки, есть ли лучший способ для этого?) и распечатать все locals(), dirs() и globals() с их размерами, но эти количества никогда не увеличиваются, а размеры довольно малы.
Структура выглядит следующим образом:
def create_model(params):
## load data from temp files
## pre-process data accordingly
## Train NN with crossvalidation clearing Keras' session every time
## save stats and clean all variables (assigning None or empty lists to them)
def Optimize():
for model in models: #I have multiple models
## load data
## save data to temp files
trials = Trials()
best_run = fmin(create_model,
space,
algo=tpe.suggest,
max_evals=100,
trials=trials)
После 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
Позвольте мне перезапустить его, и я извлеку это.
@AlexJadczak, это было полезно. Я использовал memory_profiler, и 90% памяти генерируется в строке, которая вызывает fmin






Мне потребовалось пару дней, чтобы понять это, поэтому я отвечу на свой вопрос, чтобы сэкономить время тому, кто столкнется с этой проблемой.
Обычно при использовании Hyperopt для Keras предлагаемая функция return функции create_model выглядит примерно так:
return {'loss': -acc, 'status': STATUS_OK, 'model': model}
Но в больших моделях, с множеством оценок, возвращаться и сохранять в памяти каждую модель не хочется, нужен только набор Гиперпараметров, который дал наименьшую loss
Просто удалив модель из возвращенного dict, проблема увеличения памяти с каждой оценкой решена.
return {'loss': -acc, 'status': STATUS_OK}
Не могли бы вы добавить эту ошибку с полной трассировкой стека в свой вопрос?