25

シーケンス予測に RNN (具体的には LSTM) を使用しようとしていました。ただし、可変シーケンス長の問題に遭遇しました。例えば、

sent_1 = "I am flying to Dubain"
sent_2 = "I was traveling from US to Dubai"

このBenchmark for building a PTB LSTM model に基づく単純な RNN を使用して、現在の単語の次の単語を予測しようとしています。

ただし、num_stepsパラメーター (以前の非表示の状態に展開するために使用される) は、各 Tensorflow のエポックで同じままにする必要があります。基本的に、文の長さが異なるため、文のバッチ処理はできません。

 # inputs = [tf.squeeze(input_, [1])
 #           for input_ in tf.split(1, num_steps, inputs)]
 # outputs, states = rnn.rnn(cell, inputs, initial_state=self._initial_state)

ここで、num_steps私の場合、すべての文に対して変更する必要があります。いくつかのハックを試しましたが、何も機能していないようです。

4

5 に答える 5

5

で説明されているバケット化とパディングのアイデアを使用できます。

   Sequence-to-Sequence モデル

また、RNN ネットワークを作成する rnn 関数は、パラメーター sequence_length を受け入れます。

例として、同じサイズのセンタンスのバケットを作成し、必要な量のゼロ、またはゼロ ワードを表すプレースホルダーを埋め込んでから、seq_length = len(zero_words) とともにそれらをフィードできます。

seq_length = tf.placeholder(tf.int32)
outputs, states = rnn.rnn(cell, inputs,initial_state=initial_state,sequence_length=seq_length)

sess = tf.Session()
feed = {
seq_lenght: 20,
#other feeds
       }
sess.run(outputs, feed_dict=feed)

ここで最も重要なことは、sequence_length を指定しているときに、1 つのセンテンスで得られた状態を次のセンテンスの状態として使用する場合 (20 で、パディング後のセンテンスが 50 であるとしましょう) です。20 番目のタイム ステップで取得した状態が必要です。そのためには、

tf.pack(states)

その電話の後

for i in range(len(sentences)):
state_mat   = session.run([states],{
            m.input_data: x,m.targets: y,m.initial_state: state,     m.early_stop:early_stop })
state = state_mat[early_stop-1,:,:]
于 2016-01-12T11:11:00.187 に答える
4

入力シーケンスの最大長を制限し、短いものをその長さにパディングし、各シーケンスの長さを記録し、tf.nn.dynamic_rnnを使用できます。通常どおり入力シーケンスを処理しますが、 で示されるシーケンスの最後の要素の後、seq_lengthセルの状態をコピーするだけで、出力にはゼロテンソルを出力します。

于 2016-10-06T16:58:43.527 に答える