【问题标题】:understanding Keras LSTM ( lstm_text_generation.py ) - RAM memory issues理解 Keras LSTM (lstm_text_generation.py) - RAM 内存问题
【发布时间】:2017-06-03 13:24:57
【问题描述】:

我正在深入研究具有 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 来处理它!)。

提前谢谢各位。

【问题讨论】:

  • 我们在谈论什么样的维度(对于您的数据集,len(sentences)len(chars) 大约有多大)?你有多少内存?
  • 我有 6Gb RAM,但我也尝试在 32Gb RAM vps 上运行它。至于尺寸:对于 520Kb 的输入文本,它们是 len(sentences)=174507len(chars)=74 ,并且运行正常。但是对于 17Mb 的输入文本,它们是 len(sentences)=5853627len(chars)=74 并且 MemoryError 在 6Gb RAM 上抛出。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您的回复,将尝试您的解决方案,并可能很快在这里提供结果。
  • 我的回答对你有帮助吗?
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2018-07-28
  • 2017-02-10
  • 2021-06-30
相关资源
最近更新 更多