python-3.x – Keras(TensorFlow,CPU):训练循环中的顺序模型吃掉内存

python-3.x – Keras(TensorFlow,CPU):训练循环中的顺序模型吃掉内存,第1张

概述我试图在一个循环中训练1000x的Sequential模型.在每个循环中,我的程序都会泄漏内存,直到我用完并获得OOM异常. 我之前已经问了一个类似的问题 (Training multiple Sequential models in a row slows down) 并看到其他类似问题(Keras: Out of memory when doing hyper parameter grid s 我试图在一个循环中训练1000x的Sequential模型.在每个循环中,我的程序都会泄漏内存,直到我用完并获得OOM异常.

我之前已经问了一个类似的问题
(Training multiple Sequential models in a row slows down)

并看到其他类似问题(Keras: Out of memory when doing hyper parameter grid search)

并且解决方案始终是在完成模型使用后将K.clear_session()添加到代码中.所以我在上一个问题中做到了这一点,我仍在泄露记忆

这是重现问题的代码.

import randomimport timefrom keras.models import Sequentialfrom keras.layers import Densefrom keras import backend as Kimport tracemallocdef 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)
/tensorflow/python/framework/ops.py:1400:size = 998 KiB(998 KiB),count = 8413(8413)
/tensorflow/python/framework/ops.py:116:size = 888 KiB(888 KiB),count = 32468(32468)
/tensorflow/python/framework/ops.py:1185:size = 795 KiB(795 KiB),count = 3179(3179)
/tensorflow/python/framework/ops.py:2354:size = 599 KiB(599 KiB),count = 5886(5886)

系统信息:

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

解决方法 内存泄漏源于Keras和TensorFlow,它使用单个“默认图”来存储网络结构,随着内部for循环的每次迭代,内存大小会增加.

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

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

总结

以上是内存溢出为你收集整理的python-3.x – Keras(TensorFlow,CPU):训练循环中的顺序模型吃掉内存全部内容,希望文章能够帮你解决python-3.x – Keras(TensorFlow,CPU):训练循环中的顺序模型吃掉内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存