我正在使用 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!)。
先谢谢你们。
答案 0 :(得分:0)
在Keras中至少有两个优化可以用来减少这种情况下需要的内存量:
一个Embedding layer,它可以只接受一个完整的一个热矢量的整数整数。此外 - 这个层可以在网络训练的最后阶段之前预先训练 - 所以你可以在模型中注入一些先验知识(甚至在网络拟合期间对它进行微调)。
使用fit_generator
方法可以使用预定义的生成器训练网络,该生成器将在网络拟合中产生对(x, y)
需要。你可以,例如将整个数据集保存到磁盘,并使用生成器接口逐个读取。
当然 - 这两种方法都可以混合使用。我认为简单性是您提供的示例中此类实现背后的原因。