Ошибка при объединении двух ячеек РНН с тензорным потоком - PullRequest
0 голосов
/ 03 мая 2018

Я получаю эту ошибку

AttributeError: 'Tensor' object has no attribute 'c'

при попытке выполнить эту функцию

def _add_encoder(self, encoder_inputs, seq_len):
with tf.variable_scope('encoder'):
  cell_fw = tf.contrib.rnn.LSTMCell(self._hps.hidden_dim.value, initializer=self.rand_unif_init, state_is_tuple=False)
  cell_bw = tf.contrib.rnn.LSTMCell(self._hps.hidden_dim.value, initializer=self.rand_unif_init, state_is_tuple=False)
  (encoder_outputs, (fw_st, bw_st)) = tf.nn.bidirectional_dynamic_rnn(cell_fw, cell_bw, encoder_inputs, dtype=tf.float32, sequence_length=seq_len, swap_memory=True)
  encoder_outputs = tf.concat(axis=2, values=encoder_outputs) # concatenate the forwards and backwards states
return encoder_outputs, fw_st, bw_st
  # Apply linear layer
  old_c = tf.concat(axis=1, values=[fw_st.c, bw_st.c]) # Concatenation of fw and bw cell

Я использую Python 3.6, TenSenflow 1.7

1 Ответ

0 голосов
/ 03 мая 2018

Короткая версия:

Удалить , state_is_tuple=False

Более длинная версия:

Согласно тензорному документу LSTMCell ,

state_is_tuple:

Если True, принятые и возвращенные состояния - это 2-кортежа c_state и m_state .

Если False, они объединяются вдоль оси столбца. Это последнее поведение скоро будет устарело .

И LSTMStateTuple

Хранит два элемента: (c, h) в указанном порядке. Где c - скрытое состояние, а h - выход.

Используется только , когда state_is_tuple = True.

Так что я предлагаю изменить

cell_fw = tf.contrib.rnn.LSTMCell(self._hps.hidden_dim.value, initializer=self.rand_unif_init, state_is_tuple=False)

до

cell_fw = tf.contrib.rnn.LSTMCell(self._hps.hidden_dim.value, initializer=self.rand_unif_init)
...