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

标签 python numpy out-of-memory theano keras

我正在研究使用 KerasTheano 后端的 LSTM RNN。在尝试使用来自 keras 的 repo 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 来处理它!)。

提前致谢,伙计们。

最佳答案

Keras 中至少有两个优化,您可以使用它们来减少这种情况下所需的内存量:

  1. Embedding layer这使得只接受一个整数而不是完整的一个热向量成为可能。此外 - 该层可以在网络训练的最后阶段之前进行预训练 - 因此您可以将一些先验知识注入(inject)您的模型(甚至在网络拟合期间对其进行微调)。

  2. A fit_generator方法使得使用预定义生成器训练网络成为可能,该生成器将生成网络拟合所需的对 (x, y)。你可以例如将整个数据集保存到磁盘并使用生成器接口(interface)逐部分读取它。

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

关于python - 了解 Keras LSTM ( lstm_text_generation.py ) - RAM 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41731743/

相关文章:

python - 从 numpy 数组在 paraview 中创建等高线图

android - ViewPager 上的 OutOfMemoryError

java - 这段Java代码中如何处理堆内存不足的情况?

Python MySQLdb 处理多个游标 : Command out of sync

python - 如何将二维数组转换为 python 3 中的元组?

python - 使用已弃用的 Numpy API

python - 如何将函数应用于 numpy 中的滚动窗口?

Java:使用 iText 将 2000-5000 个 PDF 合并为 1 个,产生 OutOfMemorryError

python - 无法对 librosa Melspectrogram 使用多线程

python - 导入错误 : attempted relative import with no known parent package when trying to import sibling inside package