2017-06-12 10 views
0

Tensorflowバージョン1.0多層エンコーダ出力状態1.0

私の質問はtf.contrib.seq2seq attention_decoder_fn_trainを期待していencoder_state引数のどのような大きさ、です。

マルチレイヤエンコーダの状態出力は可能ですか?

コンテキスト

私は1.0 tensorflow 多層双方向の注意ベースseq2seqを作成したいです。

マイエンコーダ:

cell = LSTM(n) 
cell = MultiRnnCell([cell]*4) 
((encoder_fw_outputs,encoder_bw_outputs), 
(encoder_fw_state,encoder_bw_state)) = (tf.nn.bidirectional_dynamic_rnn(cell_fw=cell, cell_bw = cell....) 

次に、mutilayered双方向エンコーダは、後方及び前方パスについても各レイヤのエンコーダcell_states[c]hidden_states[h]戻って。 私はencoder_stateするためにそれを渡すために往路と復路の状態連結:

self.encoder_state = tf.concat((encoder_fw_state, encoder_bw_state), -1)

をそして、私は私のデコーダにこれを渡します

decoder_fn_train = seq2seq.simple_decoder_fn_train(encoder_state=self.encoder_state) 
(self.decoder_outputs_train, 
self.decoder_state_train, 
self.decoder_context_state_train) = seq2seq.dynamic_rnn_decoder(cell=decoder_cell,...) 

しかし、それは次のエラーを与える:

ValueError: The two structures don't have the same number of elements. First structure: Tensor("BidirectionalEncoder/transpose:0", shape=(?, 2, 2, 20), dtype=float32), second structure: (LSTMStateTuple(c=20, h=20), LSTMStateTuple(c=20, h=20)).

私のdecoder_cellもまた多層です。

Link to my code

1

答えて

0

私は私の実装に問題を発見しました。そこでここに投稿してください。 問題はw.r.tです。 encoder_fw_stateencoder_bw_stateを連結します。正しい方法は次のとおりです。

self.encoder_state = [] 

    for i in range(self.num_layers): 
     if isinstance(encoder_fw_state[i], LSTMStateTuple): 

      encoder_state_c = tf.concat((encoder_fw_state[i].c, encoder_bw_state[i].c), 1, name='bidirectional_concat_c') 
      encoder_state_h = tf.concat((encoder_fw_state[i].h, encoder_bw_state[i].h), 1, name='bidirectional_concat_h') 
      encoder_state = LSTMStateTuple(c=encoder_state_c, h=encoder_state_h) 
     elif isinstance(encoder_fw_state[i], tf.Tensor): 
      encoder_state = tf.concat((encoder_fw_state[i], encoder_bw_state[i]), 1, name='bidirectional_concat') 
     self.encoder_state.append(encoder_state) 

    self.encoder_state = tuple(self.encoder_state) 
関連する問題