python-3.x – Keras(TensorFlow,CPU):训练循环中的顺序模型吃掉内存
我试图在一个循环中训练1000x的Sequential模型.在每个循环中,我的程序都会泄漏内存,直到我用完并获得OOM异常. 我之前已经问了一个类似的问题 并看到其他类似问题(Keras: Out of memory when doing hyper parameter grid search) 并且解决方案始终是在完成模型使用后将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 = 3485 KiB(3485 KiB),count = 42343(42343) 系统信息: > python 3.5 解决方法内存泄漏源于Keras和TensorFlow,它使用单个“默认图”来存储网络结构,随着内部for循环的每次迭代,内存大小会增加.调用K.clear_session()释放了迭代之间与默认图关联的一些(后端)状态,但需要额外调用 请注意,可能存在更有效的解决方案:由于nn不依赖于任何一个循环变量,因此可以在循环外定义它,并在循环内重用相同的实例.如果这样做,则无需清除会话或重置默认图表,并且性能会提高,因为您可以从迭代之间的缓存中受益. (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |