2

シーケンスからシーケンスへの言語モデルを実装しようとしていました。学習過程で、モデルは GloVe によって生成された 50d の単語ベクトルのシーケンスを取り込み、次の単語を意味する 1 対 V (V は語彙のサイズ) のベクトルを出力します。これは、対応する次の単語の分布と見なすことができます。テストプロセスの現在のタイムステップでの入力単語ベクトルに、112単語の語彙で試しました。

次に、次の 2 つのモデルを作成しました。

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 を発生させましたが、2 番目のモデル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.

新しい time-distributed-dense を 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)に変形し(batchsz*timesteps,units)ます。ただし、再形成された配列がC連続でない場合(データはn次元のC配列としてソートされる)、現在、再形成は新しい配列を割り当てていますが、これはあなたの場合ではないと思われます。

あなたが試すことができるのは、入力に固定バッチサイズを指定することです。この場合、多くのメモリを割り当てずTimeDistributedに入力を順番に処理します。K.rnn

于 2016-09-11T20:15:09.413 に答える