Я пытаюсь создать одну сетевую архитектуру, которая состоит из 4 двунаправленных lstm, и я хочу суммировать их все и перейти к одной линейной проекции слоя.
Итак, моя структура сети:
Lstm
Lstm
Lstm
Lstm
Sum(All_four_lstm_last_state)
Linear_layer ( Sum )
Softmax( Linear_layer )
Моя путаница в том, что я создал одну функцию для ячеек Lstm, и я хочу повторно использовать ее для всех четырех rnn, но я не совсем понимаю, что такое variable_scope.
Итак, мой код выглядит так:
Сначала я создал функцию lstm ячейки:
with tf.variable_scope('encoder'):
# forward cell of Bi-directional lstm network
def fr_cell():
fr_cell_lstm = rnn.LSTMCell(num_units=rnn_num_units, forget_bias=forget_bias_)
return rnn.DropoutWrapper(cell=fr_cell_lstm, output_keep_prob=1. - dropout, dtype=tf.float32)
fr_cell_m = rnn.MultiRNNCell([fr_cell() for _ in range(1)], state_is_tuple=True)
with tf.variable_scope('encoder'):
def bw_cell():
bw_cell_lstm = rnn.LSTMCell(num_units=rnn_num_units, forget_bias=forget_bias_)
return rnn.DropoutWrapper(cell=bw_cell_lstm, output_keep_prob=1. - dropout, dtype=tf.float32)
bw_cell_m = rnn.MultiRNNCell([bw_cell() for _ in range(1)], state_is_tuple=True)
Теперь у меня есть четыре RNN:
# Bi-directional lstm network
with tf.variable_scope('encoder') as scope:
model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
cell_fw=fr_cell_m, # forward cell
cell_bw=bw_cell_m, # backward cell
inputs=long_word_embedding_lookup, # 3 dim embedding input for rnn
sequence_length= l_w_sequence_len, # sequence len == batch_size
dtype=tf.float32
)
transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])
long_word_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)
# Bi-directional lstm network
with tf.variable_scope('encoder') as scope:
model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
cell_fw=fr_cell_m, # forward cell
cell_bw=bw_cell_m, # backward cell
inputs=short_word_embedding_lookup, # 3 dim embedding input for rnn
sequence_length=s_w_sequence_len, # sequence len == batch_size
dtype=tf.float32
)
transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])
short_word_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)
with tf.variable_scope('encoder') as scope:
model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
cell_fw=fr_cell_m, # forward cell
cell_bw=bw_cell_m, # backward cell
inputs=long_char_embedding_lookup, # 3 dim embedding input for rnn
sequence_length=l_c_sequence_len, # sequence len == batch_size
dtype=tf.float32
)
transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])
long_char_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)
with tf.variable_scope('encoder') as scope:
model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
cell_fw=fr_cell_m, # forward cell
cell_bw=bw_cell_m, # backward cell
inputs=short_char_embedding_lookup, # 3 dim embedding input for rnn
sequence_length=s_c_sequence_len, # sequence len == batch_size
dtype=tf.float32
)
transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])
short_char_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)
Как вы можете видеть, я использую тот же name_scope ('encode') дляИстм и все четыре рнн.
Я был бы очень признателен, если бы кто-нибудь любезно дал мне несколько советов о том, правильный ли это подход или что я должен изменить, если все мои четыре входных значения отличаются, и я собираюсь суммировать наконец.
Заранее спасибо.