在keras中优化大输入内存使用的任何方法?

时间:2017-01-23 05:23:23

标签: python memory neural-network out-of-memory keras

我正在尝试使用2D CNN对中文文章进行文本分类,并且遇到了keras Convolution2D的麻烦。我知道Convolution2D处理图像的基本流程,但是使用我的数据集与keras一起使用。这是我的一个问题:

数据集

  1. 9800中文文章。

    负面文章和非负面文章[请注意它可能是正面的或中立的],只是一个二元分类问题。我对Convolution1D NN进行了测试,但结果并不好。

  2. 使用tokenizer和word2vec转换为形状(9800, 6810, 200)

    最长的文章有6810个单词,最短的文章少了50个字,需要填充所有文章到6810,200个是word2vec大小(好像有人称之为embedding_size?)。格式如:

     1     [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
     2     [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
     ....
     9999  [[word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200], [word2vec size=200]]
    
  3. 文章是否最多字长6810太大了? 我必须将9800个样本减少到6500以避免MemoryError,因为6500已经占用了我所有的32GB内存。有什么方法可以优化内存使用量,除了将所有文章修剪为更短的长度?

1 个答案:

答案 0 :(得分:5)

Keras FAQ已经部分回答了这个问题。您可以使用model.fit_generator()以块的形式加载数据。生成器在一个单独的线程中运行并生成您的迷你批次,可能会逐个从存档中加载它们,避免一次将所有内容加载到RAM中。

使用它的代码大致如下:

def train_generator():
    while True:
        chunk = read_next_chunk_of_data()
        x,y = extract_training_data_from_chunk(chunk)
        yield (x,y)

 model.fit_generator(generator=train_generator())