Определение можно найти в: коде тензорного потока 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, я думаю, что ее также можно решить аналогичным образом.