2017-10-24 4 views
1

テンソルフローで2つのLSTM状態を連結しようとしています。これまではtf.concatで処理されていましたが、これは結果として得られる状態でログを計算する必要があり、'Tensor' object is not iterableから結果の状態を繰り返し処理することができないため動作しません。ここでTensorflowで2つのRNN状態を連結する

は私がしようとしているものです:

outputs, fstate = tf.nn.dynamic_rnn(cell=lstm, inputs=rnn_inputs, 
             sequence_length=lengths, 
             dtype=tf.float32, time_major=False) 
outputs2, fstate2 = tf.nn.dynamic_rnn(cell=lstm2, inputs=rnn_inputs2, 
             sequence_length=lengths2, 
             dtype=tf.float32, time_major=False) 

newRnnState = tf.concat([fstate, fstate2], 1) 
logits = tf.matmul(tf.concat([f.h for f in newRnnState], 1), output_layer[0]) + output_bias[0] 

これはエラーを返します:TypeError: 'Tensor' object is not iterable.

は、私は2つのRNN一緒に述べているとのようにそれらを使用するを連結できるように、これを実行する方法はありますこの?

おかげ

+1

newRnStateはテンソルであり配列ではないため、このエラーが発生します。あなたがしたいことに応じて、これを試すことができます: logits = tf.matmul(tf.concat([fstate.h、fstate2.h]、1)、output_layer [0])+ output_bias [0] –

+0

@AnthonyD 'アマートこれは、fstateがLSTMStateTupleなので動作しません。しかし、もし私が代わりに 'logits [0] = tf.matmul(tf.concat([fstate [0] .h、fstate2 [0] .h]、1)、output_layer [0])+ output_bias [0] '、それは連結で成功しますが、後で出力形状が正しくないと不平を言う。それぞれのLSTMセルのサイズが256であるので、 '(9、256)'でなければなりません。 'output_layer [0]'との乗算はできません。 '(256、出力)'のサイズです。正しい解決策は 'output_layer'サイズを変更することではないと思いますか? – hockeybro

+0

ハァーよ、申し訳ありません私はそれがタプルだったことを忘れました、あなたは正しいです。しかし、各LSTMは256のセルサイズを持っているので、軸1に沿って両方の出力を連結すると512になります。output_layerのサイズを(cell_size * 2、output) –

答えて

1

あなたは次にあなたが使用できる1軸に沿ってcell_sizeサイズの2つの状態を連結しているので、我々はコメントで言ったことによると、あなたは(2*cell_size, output_size)に出力層のサイズを設定する必要があります。 tf.matmul(tf.concat([fstate[0].h, fstate2[0].h], 1), output_layer[0]) + output_bias[0]

関連する問題