内存不足训练顺序模型在for循环中;先前的解决方案不起作用

时间:2018-11-03 19:18:32

标签: python tensorflow keras

我正在for循环中训练一系列模型-测试某种架构。这样做时,我的内存不足,系统关闭了该进程。

相同的问题出现在this questionthis question中。为了尝试他们的解决方案,我进行了一次测试,并与给我带来问题的循环进行了类似的循环。代码是:

def mem_test(n):
    train_data = np.random.rand(1000,1500)
    train_labels = np.random.randint(2,size= 1000)
    mem = []
    for i in range(n):
        model = keras.Sequential([keras.layers.Dense(1000, activation= tf.nn.relu), 
                          keras.layers.Dense(2,activation = tf.nn.softmax)])
        model.compile(optimizer= tf.train.AdamOptimizer(.001), loss = 'sparse_categorical_crossentropy', 
                      metrics = ['accuracy'])
        model.fit(train_data,train_labels, epochs = 1)
        mem.append(psutil.virtual_memory())
    return mem


def mem_test_clear(n):
    train_data = np.random.rand(1000,1500)
    train_labels = np.random.randint(2,size= 1000)
    mem = []
    for i in range(n):
        model = keras.Sequential([keras.layers.Dense(1000, activation= tf.nn.relu), 
                          keras.layers.Dense(2,activation = tf.nn.softmax)])
        model.compile(optimizer= tf.train.AdamOptimizer(.001), loss = 'sparse_categorical_crossentropy', 
                      metrics = ['accuracy'])
        model.fit(train_data,train_labels, epochs = 1)
        mem.append(psutil.virtual_memory())
        keras.backend.clear_session()
        tf.reset_default_graph()
    return mem

尽管后者似乎比前者要好一些,但它们最终仍会累积内存使用情况。因此,对于我的实际应用,我没有解决方案。在这种情况下,我需要做什么才能真正释放内存?我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您只需编译一次模型。 然后,您可以构建一个循环来拟合它:

import numpy as np
import psutil
import keras
import tensorflow as tf

def mem_test(n):
    train_data = np.random.rand(1000,1500)
    train_labels = np.random.randint(2,size= 1000)
    mem = []

    model = keras.Sequential([keras.layers.Dense(1000, activation= tf.nn.relu), 
                  keras.layers.Dense(2,activation = tf.nn.softmax)])
    model.compile(optimizer= tf.train.AdamOptimizer(.001), loss = 'sparse_categorical_crossentropy', 
                  metrics = ['accuracy'])

    for i in range(n):
        model.fit(train_data,train_labels, epochs = 1)
        mem.append(psutil.virtual_memory())
    return mem

mem_test(50)

这样,它将仅消耗少量内存,并且不会累积任何内容。此外,这就是模型正确运行的方式。