了解 Keras LSTM ( lstm_text_ Generation.py ) - RAM 内存问题

2024-01-26

我正在深入研究 LSTM RNNKeras and Theano后端。在尝试使用 keras 存储库中的 lstm 示例时github上lstm_text_ Generation.py的完整代码 https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py,我有一件事不太清楚:它矢量化输入数据(文本字符)的方式:

# 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. An 嵌入层 https://keras.io/layers/embeddings/这使得只接受一个整数而不是完整的一个热向量成为可能。此外 - 该层可以在网络训练的最后阶段之前进行预训练 - 因此您可以将一些先验知识注入到您的模型中(甚至在网络拟合期间对其进行微调)。

  2. A fit_generator https://keras.io/models/model/方法使得可以使用预定义的生成器来训练网络,该生成器会生成对(x, y)网络拟合的需要。你可以例如将整个数据集保存到磁盘并使用生成器接口部分读取。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Keras LSTM ( lstm_text_ Generation.py ) - RAM 内存问题 的相关文章