我正在学习使用Keras和Theano后端进行LSTM RNN。在尝试使用keras存储库中的lstm示例(lstm_text_generation.py的完整代码在github上)时,有一件事情让我不太清楚:它是如何对输入数据(文本字符)进行向量化的:
# 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(需要数十GB的RAM来处理它!)。
提前感谢大家。
len(sentences)
和len(chars)
大约有多大)?你有多少RAM? - ali_m