[PYTHON] RNN AutoEncoder

Bitte weisen Sie auf Fehler hin.

Was ist AutoEncoder überhaupt?

Eines der unbeaufsichtigten Lernvorgänge, bei denen die gleichen Daten wie die Eingabedaten aus der Ausgabe des NN abgerufen werden können. auto_encoder_model_from_wiki Wie in der obigen Abbildung gezeigt, ist das Modell eng und es wird tatsächlich nur die mittlere Schicht verwendet. Grob gesagt besteht der Zweck dieses Modells darin, Merkmale für die Eingabe zu extrahieren.

RNN AutoEncoder Screenshot from 2017-07-16 23-16-44.png Der RNN AutoEncoder wird wie oben modelliert und verwendet den letzten Status der RNN-Zelle des Encoders. Im Gegensatz zum Basis-AutoEncoder zielt RNN AutoEncoder darauf ab, Features aus sequentiellen Daten zu extrahieren. Daher ist es möglich, Features aus Videos und Texten zu extrahieren.

Implementierung in Tensorflow

model.py


import tensorflow as tf
import tensorflow.contrib.seq2seq as seq2seq

Diesmal verwendet der Decoderteil das Modul seq2seq.

model.py


with tf.variable_scope('LSTM_ENCODER'):
    cell_ = tf.contrib.rnn.BasicLSTMCell(args.rnn_size, reuse=tf.get_variable_scope().reuse)
    encoder_outputs, encoder_final_state = tf.nn.dynamic_rnn(cell_, encoder_inputs,\                                                             
                                                             initial_state=cell_.zero_state(batch_size=args.batch_size, dtype=tf.float32),\
                                                             dtype=tf.float32)

Der Encoder-Teil sieht so aus. Der Teil, in dem "encoder_final_state" der Zweck ist.

model.py


with tf.variable_scope('LSTM_DECODER'):
    cell_ = tf.contrib.rnn.BasicLSTMCell(args.rnn_size, reuse=tf.get_variable_scope().reuse)
    helper = seq2seq.TrainingHelper(decoder_input, tf.cast([args.max_time_step]*args.batch_size, tf.int32))
    decoder = seq2seq.BasicDecoder(cell_, helper=helper, initial_state=encoder_final_state)
    basic_decoder_out, _, _ =  seq2seq.dynamic_decode(decoder= decoder)
    decoder_output, _ = basic_decoder_out

Der Decoderteil kann so geschrieben werden.

model.py


with tf.variable_scope('LSTM_DECODER_LOSS'):
    out_w = tf.get_variable('decoder_out_w', shape=[args.rnn_size, args.vocab_size], dtype=tf.float32, initializer=tf.random_normal_initializer)
    out_b = tf.get_variable('decoder_out_b', shape=[args.vocab_size], dtype=tf.float32, initializer=tf.random_normal_initializer)

    outs = []
    time_step_major = tf.unstack(tf.transpose(decoder_output, [1, 0, 2]))
    for i, t_out in enumerate(time_step_major):
        outs.append(tf.nn.relu(tf.nn.xw_plus_b(t_out, out_w, out_b, 'dense')))
    logits = tf.transpose(tf.convert_to_tensor(outs), [1, 0, 2]) 
    self.loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.reshape(self.decoder_labels, [-1, args.vocab_size]), logits=tf.reshape(logits, [-1, args.vocab_size])))

Verlust kann wie oben geschrieben werden. Danach ist es in Ordnung, wenn Sie jede Variable aus der Sitzung füttern und wie gewohnt optimieren.

Referenz

Klicken Sie hier für das Papier LSTM AE-Papier Autoencoder mit Keras gelernt

Recommended Posts

RNN AutoEncoder
Übe RNN TensorFlow