Python 3.x Keras(TensorFlow,CPU):在循环内存中训练序列模型

Python 3.x Keras(TensorFlow,CPU):在循环内存中训练序列模型,python-3.x,tensorflow,keras,Python 3.x,Tensorflow,Keras,我试图在一个循环中训练1000个顺序模型。在每个循环中,我的程序都会泄漏内存,直到我耗尽内存并出现OOM异常 我以前也问过类似的问题 () 看到其他人也有类似的问题() 解决方法总是在使用完模型后,将K.clear_session()添加到代码中。所以我在上一个问题中这样做了,我仍然在泄漏内存 下面是重现问题的代码 import random import time from keras.models import Sequential from keras.layers import Dens

我试图在一个循环中训练1000个顺序模型。在每个循环中,我的程序都会泄漏内存,直到我耗尽内存并出现OOM异常

我以前也问过类似的问题 ()

看到其他人也有类似的问题()

解决方法总是在使用完模型后,将
K.clear_session()
添加到代码中。所以我在上一个问题中这样做了,我仍然在泄漏内存

下面是重现问题的代码

import random
import time
from keras.models import Sequential
from keras.layers import Dense
from keras import backend as K
import tracemalloc


def run():
    tracemalloc.start()
    num_input_nodes = 12
    num_hidden_nodes = 8
    num_output_nodes = 1

    random_numbers = random.sample(range(1000), 50)
    train_x, train_y = create_training_dataset(random_numbers, num_input_nodes)

    for i in range(100):
        snapshot = tracemalloc.take_snapshot()
        for j in range(10):
            start_time = time.time()
            nn = Sequential()
            nn.add(Dense(num_hidden_nodes, input_dim=num_input_nodes, activation='relu'))
            nn.add(Dense(num_output_nodes))
            nn.compile(loss='mean_squared_error', optimizer='adam')
            nn.fit(train_x, train_y, nb_epoch=300, batch_size=2, verbose=0)
            K.clear_session()
            print("Iteration {iter}. Current time {t}. Took {elapsed} seconds".
                  format(iter=i*10 + j + 1, t=time.strftime('%H:%M:%S'), elapsed=int(time.time() - start_time)))

        top_stats = tracemalloc.take_snapshot().compare_to(snapshot, 'lineno')

        print("[ Top 5 differences ]")
        for stat in top_stats[:5]:
            print(stat)


def create_training_dataset(dataset, input_nodes):
    """
    Outputs a training dataset (train_x, train_y) as numpy arrays.
    Each item in train_x has 'input_nodes' number of items while train_y items are of size 1
    :param dataset: list of ints
    :param input_nodes:
    :return: (numpy array, numpy array), train_x, train_y
    """
    data_x, data_y = [], []
    for i in range(len(dataset) - input_nodes - 1):
        a = dataset[i:(i + input_nodes)]
        data_x.append(a)
        data_y.append(dataset[i + input_nodes])
    return numpy.array(data_x), numpy.array(data_y)

run()
这是我从第一次内存调试打印中得到的输出

/tensorflow/python/framework/ops.py:121:size=3485kib(+3485kib),count=42343(+42343) /tensorflow/python/framework/ops.py:1400:size=998kib(+998kib),count=8413(+8413) /tensorflow/python/framework/ops.py:116:size=888kib(+888kib),count=32468(+32468) /tensorflow/python/framework/ops.py:1185:size=795kib(+795kib),count=3179(+3179) /tensorflow/python/framework/ops.py:2354:size=599kib(+599kib),count=5886(+5886)

系统信息:

  • python 3.5
  • keras(1.2.2)
  • tensorflow(1.0.0)

内存泄漏源于Keras和TensorFlow,它们使用一个“默认图”来存储网络结构,该网络结构的大小随着内部循环的每次迭代而增加

调用
K.clear_session()
可以在迭代之间释放与默认图关联的一些(后端)状态,但是需要额外调用来清除Python状态


请注意,可能有一个更有效的解决方案:由于
nn
不依赖于任何一个循环变量,因此可以在循环外部定义它,并在循环内部重用相同的实例。如果您这样做,就不需要清除会话或重置默认图,性能应该会提高,因为您可以从迭代之间的缓存中获益。

您可以尝试添加一个
tf。在
K之后,重置默认图()
(以及
将tensorflow导入为tf
)。清除会话()
?效果非常好。谢谢尝试在循环中运行keras模型。获取
ValueError:检查目标时出错:预期密集_1有2个维度,但得到的数组具有形状(2000,10,10)
,这是由于循环造成的。我在循环结束时尝试了
K.clear\u session()
,然后是
tf.reset\u default\u graph()
,但没有帮助。知道吗?不完全知道<代码>K.清除会话()已经调用了
tf.reset\u default\u graph()
内部。然后你会复制它,不是吗?Dilshat是对的,在这个节目的第95行。所以没有必要再打第二个电话。