как сделать декодер в rnn, tenorflow, подать предыдущий вывод - PullRequest
0 голосов
/ 02 октября 2018

Мне интересно, как сделать декодер в тензорном потоке, передать его i-й выход на (i + 1) -й вход

мои входы имеют 20 последовательностей и 3680 измерений, а мои выходы имеют 39 последовательностей и 3680dementions все данные 0 ~ 1 число

вот моя модель

with tf.variable_scope('encoder'):    
    enc_input = tf.placeholder(tf.float32,[None, input_sequence_length, input_dim])

    enc_cell = tf.contrib.rnn.BasicLSTMCell(num_units = input_sequence_length)

    _ , encoder_states = tf.nn.dynamic_rnn(enc_cell, enc_input ,  dtype=tf.float32)

with tf.variable_scope('decoder'):
    dec_input = tf.placeholder(tf.float32,[None, output_sequence_length, output_dim])
    dec_output = tf.placeholder(tf.float32,[None, output_sequence_length, output_dim])

    dec_cell = tf.contrib.rnn.BasicLSTMCell(num_units = output_sequence_length)

    outputs , _ = tf.nn.dynamic_rnn(dec_cell, dec_input,dtype = tf.float32,
                                    initial_state = encoder_states)

как я могу сделать модель декодера, которая подает предыдущие выходы на следующий вход?

PS

Я создаю свой код самоответа следующим образом

with tf.variable_scope('decoder'):
    dec_input = tf.placeholder(tf.float32,[None, 1, output_dim])
    dec_output = tf.placeholder(tf.float32,[None, output_sequence_length, output_dim])

    outputs = []
    state = encoder_states

    dec_cell = tf.contrib.rnn.BasicLSTMCell(num_units = dec_hidden_size)

    for i in range(output_sequence_length):
        if i==0:
            output , state = tf.nn.dynamic_rnn(dec_cell, dec_input, initial_state = state, dtype = tf.float32)
            outputs.append(output)
        else:
            output , state = tf.nn.dynamic_rnn(dec_cell, 
                                                 output, 
                                                 initial_state = state, 
                                                 dtype = tf.float32)
            outputs.append(output)

outputs = tf.reshape(outputs,[-1,output_dim])
outputs = tf.reshape(outputs,[-1,output_sequence_length,output_dim])

Я думаю, что вывод этого кода отличается от вывода верхнего кода, но я не уверен, что он работал правильно.

, поэтомуТем не менее, мне интересно, как сделать декодер, который имеет функцию цикла ((i) output -> (i + 1) input) с методом тензорного потока, потому что он занимает больше памяти, чем верхний код.(в моей мысли он имеет такое же количество клеток)

...