2

我试图实现一个序列到序列的语言模型。在训练过程中,模型将 GloVe 生成的 50d 个词向量序列,输出 1-to-V(V 是词汇量的大小)向量表示下一个词,因此可以看作下一个词对应的分布到测试过程中当前时间步的输入词向量,我尝试了一个 112 词的词汇表。

然后,我构建了两个模型,如下所示:

model1 = Sequential()
model1.add(LSTM(112, return_sequences=True, input_shape=(31, 50)))

model2 = Sequential()
model2.add(LSTM(112, return_sequences=True, input_shape=(31, 50)))
model2.add(TimeDistributed(Dense(112, activation="linear")))

当我试图通过

model.fit(X, Y, batch_size=128, nb_epoch=256, validation_rate=0.1)

第一个模型model1崩溃并引发 MemoryError,但第二个模型model2正常完成。X 的形状为(number_of_sentences, max_words_in_one_sentence, 50),Y 的形状为(number_of_sentences, max_words_in_one_sentence, 112)。在这个例子中,number_of_sentences=10000, max_words_in_one_sentence=13

我想知道当我将一个新的时间分布密集附加到 LSTM 层时发生了什么,以及哪个是我想要实现我的语言模型的模型。

4

1 回答 1

0

发生的事情是您的计算设备(可能是 GPU)内存不足。我怀疑它是 NVIDIA 卡(由于缺乏替代品),因此请检查输出nvidia-smi以查看是否遇到内存问题。

根据后端(Theano 或 TensorFlow),您可能会在内存使用方面遇到不同的行为,因此在某些情况下切换后端可能是一种解决方案。

如果您使用的是 Theano,问题可能是TimeDistributed包装器。TimeDistributed在未指定批量大小时执行此操作:

K.reshape(x, (-1,) + input_shape[2:])

所以它基本上x(batchsz,timesteps,units)to重塑(batchsz*timesteps,units)。但是,如果重新整形的数组不是 C 连续的(数据按 n 维 C 数组排序),那么 reshape 当前正在分配一个新数组,我怀疑您的情况并非如此。

您可以尝试为您的输入指定一个固定的批量大小,在这种情况下,TimeDistributed将使用顺序处理输入,K.rnn而无需分配尽可能多的内存。

于 2016-09-11T20:15:09.413 回答