理解Keras LSTM(lstm_text_generation.py) - RAM内存问题

时间:2017-01-19 00:21:26

标签: python numpy out-of-memory theano keras

我正在使用 Keras Theano 后端进入LSTM RNN。在尝试使用keras'remo whole code of lstm_text_generation.py on github中的lstm示例时,我有一件事情对我来说不太清楚:它是否对输入数据进行矢量化(文本字符):

# cut the text in semi-redundant sequences of maxlen characters
maxlen = 40
step = 3
sentences = []
next_chars = []
for i in range(0, len(text) - maxlen, step):
    sentences.append(text[i: i + maxlen])
    next_chars.append(text[i + maxlen])
print('nb sequences:', len(sentences))

#np - means numpy
print('Vectorization...')
X = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool)
for i, sentence in enumerate(sentences):
    for t, char in enumerate(sentence):
        X[i, t, char_indices[char]] = 1
    y[i, char_indices[next_chars[i]]] = 1

在这里,正如您所看到的,它们会生成带有 Numpy 的零列表,然后将“1”放入由输入字符编码序列定义的每个列表的特定位置。

问题是:为什么他们使用该算法?有可能以某种方式优化它吗?也许有可能以其他方式编码输入数据,而不是使用庞大的列表列表?问题是它有严格的输入数据限制:为> 10 Mb文本生成这样的向量会导致Python的MemoryError(处理它需要几十个Gbs RAM!)。

先谢谢你们。

1 个答案:

答案 0 :(得分:0)

在Keras中至少有两个优化可以用来减少这种情况下需要的内存量:

  1. 一个Embedding layer,它可以只接受一个完整的一个热矢量的整数整数。此外 - 这个层可以在网络训练的最后阶段之前预先训练 - 所以你可以在模型中注入一些先验知识(甚至在网络拟合期间对它进行微调)。

  2. 使用fit_generator方法可以使用预定义的生成器训练网络,该生成器将在网络拟合中产生对(x, y)需要。你可以,例如将整个数据集保存到磁盘,并使用生成器接口逐个读取。

  3. 当然 - 这两种方法都可以混合使用。我认为简单性是您提供的示例中此类实现背后的原因。