2017-01-19 8 views
2

私はLSTM RNNにKerasTheanoバックエンドでダイビングしています。あなたのように、Keras LSTM(lstm_text_generation.py) - RAMメモリの問題

ここ
# 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 

:それは、入力データをベクトル化の道(テキスト文字):keras'レポwhole code of lstm_text_generation.py on githubからLSTM例を使用しようとしますが、私は私にはかなり明確ではない一つのことを持っていますそれらが030のリストを生成するのはNumpyであり、このようにしてシーケンスを符号化する入力文字によって定義される各リストの特定の位置に '1'を入れる。

問題は、なぜ彼らはそのアルゴリズムを使用したのですか?何とかそれを最適化することは可能ですか?巨大なリストのリストを使用せずに、入力データを他の方法でエンコードすることは可能でしょうか?問題は、入力データに厳しい制限があることです.10Mバイトを超えるテキストに対してこのようなベクトルを生成すると、PythonのMemoryErrorが発生します(これを処理するには数十GbsのRAMが必要です)。

ありがとうございました。

+0

私たちはどのような次元の話をしていますか(あなたのデータセットには 'len(文)'と 'len(chars)あなたはどれくらいのRAMを持っていますか? –

+0

私は6GbのRAMを持っていますが、私は32GbのRAMのvpsで実行しようとしました。ディメンション:520KBの入力テキストの場合は、_len(文章)= 174507_と_len(文字)= 74_です。すべてがOKです。しかし、17Mbの入力テキストの場合は_len(文)= 5853627_と_len(文字)= 74_であり、MemoryErrorは6GbのRAMをスローします。 –

答えて

0

あなたは、この場合に必要なメモリの量を減少させるために使用することができKerasに少なくとも2つの最適化があります。

  1. のみ単一の整数inteadを受け入れることを可能にするEmbedding layerは、完全な1つのホットベクトルの。さらに、ネットワークトレーニングの最終段階の前にこの層を事前にトレーニングすることができます。そのため、事前知識をモデルに注入することができます。

  2. fit_generator方法は、ネットワークフィッティングにおいて、(x, y)の組を必要とする予め定められた生成器を使用してネットワークを訓練することを可能にする。たとえば、データセット全体をディスクに保存し、ジェネレータインターフェイスを使用して部分的に読み取ります。

もちろん、両方の方法を混在させることもできます。私が提供した例では、この種の実装の背後にはシンプルさが理由だと思います。

+0

ご回答いただきありがとうございます。あなたのソリューションを試して、すぐに結果をすぐに提供してくれるでしょう。 –

+0

私の答えはあなたを助けましたか? –