Я хочу использовать как выход1 кодера с тремя слоями, так и выход2 кодера через слой внимания.
Однако мой код сначала создает ячейку кодера, затем оборачивает механизм внимания в ячейку кодера, а затем создает весь слой LSTM.
Итак, я хочу получить и output1 уровня LSTM, и output2, который впоследствии проходит через уровень внимания.
Однако, кажется, что только LSTM + слой внимания сделан сразу.
Могу ли я создать отдельные слои LSTM и внимания и связать их вместе?
См. Два кода avsr / encoder.py и avsr / cell.py в https://github.com/georgesterpu/Sigmedia-AVSR.
self._encoder_cells = build_rnn_layers(
cell_type=self._hparams.cell_type,
num_units_per_layer=self._num_units_per_layer,
use_dropout=self._hparams.use_dropout,
dropout_probability=self._hparams.dropout_probability,
mode=self._mode,
as_list=True,
dtype=self._hparams.dtype)
attention_mechanism, output_attention = create_attention_mechanism(
attention_type=self._hparams.attention_type[0][0],
num_units=self._num_units_per_layer[-1],
memory=self._attended_memory,
memory_sequence_length=self._attended_memory_length,
mode=self._mode,
dtype=self._hparams.dtype
)
attention_cells = seq2seq.AttentionWrapper(
cell=self._encoder_cells[-1],
attention_mechanism=attention_mechanism,
attention_layer_size=self._hparams.decoder_units_per_layer[-1],
alignment_history=self._hparams.write_attention_alignment,
output_attention=output_attention,
)
self._encoder_cells[-1] = attention_cells
self._encoder_outputs, self._encoder_final_state = tf.nn.dynamic_rnn(
cell=MultiRNNCell(self._encoder_cells),
inputs=encoder_inputs,
sequence_length=self._inputs_len,
parallel_iterations=self._hparams.batch_size[0 if self._mode == 'train' else 1],
swap_memory=False,
dtype=self._hparams.dtype,
scope=scope,
)
def create_attention_mechanism(
attention_type,
num_units,
memory,
memory_sequence_length,
mode,
dtype):
if attention_type == 'bahdanau':
attention_mechanism = seq2seq.BahdanauAttention(
num_units=num_units,
memory=memory,
memory_sequence_length=memory_sequence_length,
normalize=False,
dtype=dtype,
)
output_attention = False