Инициализация состояния CSTNN LSTM - PullRequest
0 голосов
/ 16 сентября 2018

Я думаю, что мы можем использовать следующий сегмент кода для создания стека LSTM и инициализировать его состояния равными нулю.

 lstm_cell = tf.contrib.rnn.BasicLSTMCell(
            hidden_size, forget_bias=0.0, state_is_tuple=True)
 cell = tf.contrib.rnn.MultiRNNCell([lstm_cell] * num_layers, state_is_tuple=True)
 cell.zero_state(batch_size, tf_float32)

Вместо использования BasicLSTMCell, я хотел бы использовать CUDNN

cudnn_cell = tf.contrib.cudnn_rnn.CudnnLSTM(
          num_layers, hidden_size, dropout=config.keep_prob)

В таком случае, как я могу сделать то же самое, что и cell.zero_state(batch_size, tf_float32) на cudnn_cell?

1 Ответ

0 голосов
/ 03 апреля 2019

Определение можно найти в: коде тензорного потока cudnn_rnn

Относительно начальных_статей:

with tf.Graph().as_default():
    lstm = CudnnLSTM(num_layers, num_units, direction, ...)
    outputs, output_states = lstm(inputs, initial_states, training=True)

Таким образом, вам нужно только добавить начальные состояния помимо входных данных для встраивания. В системе кодер-декодер это будет выглядеть так:

encoder_cell = tf.contrib.cudnn_rnn.CudnnLSTM(num_layers, hidden_size)
encoder_output, encoder_state = encoder_cell(encoder_embedding_input)
decoder_cell = tf.contrib.cudnn_rnn.CudnnLSTM(num_layers, hidden_size)
decoder_output, decoder_state = encoder_cell(decoder_embedding_input,
                                             initial_states=encoder_state)

Здесь encoder_state - это tuple как (final_c_state, final_h_state). И форма обоих состояний (1, batch, hidden_size)

Если ваш кодировщик двунаправленный RNN, это будет немного сложнее, так как выходные состояния теперь становятся (2, batch, hidden_size).

Следовательно, я использую обходной путь, чтобы решить это.

encoder_cell = tf.contrib.cudnn_rnn.CudnnLSTM(num_layers, hidden_size, direction="bidirectional")
encoder_output, (encoder_c_state, encoder_h_state) = encoder_cell(encoder_embedding_input)
fw_c, bw_c = tf.split(encoder_c_state, [1, 1], axis=0)
fw_h, bw_h = tf.split(encoder_h_state, [1, 1], axis=0)
reshape_encoder_c_state = tf.concat((fw_c, bw_c), axis=2)
reshape_encoder_h_state = tf.concat((fw_h, bw_h), axis=2)
encoder_state = (reshape_encoder_c_state, reshape_encoder_h_state)

Хотя я не пробовал многоуровневую RNN, я думаю, что ее также можно решить аналогичным образом.

...