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

问题描述

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

同样的问题出现在这个问题这个问题中。为了尝试他们的解决方案,我使用与给我带来问题的循环类似的循环进行了测试运行。代码是:

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

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

标签: pythontensorflowkeras

解决方案


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

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)

这样它只会消耗少量的内存并且不会积累任何东西。此外,这是您的模型正确工作的方式。


推荐阅读