【问题标题】:Raise MemoryError when I am fitting a sequence to sequence LSTM using Keras+Theano当我使用 Keras+Theano 将序列拟合到序列 LSTM 时引发 MemoryError
【发布时间】:2016-09-08 11:21:00
【问题描述】:

我试图实现一个序列到序列的语言模型。在训练过程中,模型将 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 层时发生了什么,以及我想要实现我的语言模型的模型。

【问题讨论】:

    标签: python keras lstm language-model


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-28
      • 2021-04-21
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多