[PYTHON] RNN AutoEncoder

Veuillez signaler toute erreur.

Qu'est-ce qu'AutoEncoder en premier lieu?

L'un des apprentissages non supervisés, qui permet d'obtenir les mêmes données que les données d'entrée à partir de la sortie du NN. auto_encoder_model_from_wiki Comme le montre la figure ci-dessus, le modèle est à l'étroit et seule la couche intermédiaire est réellement utilisée. En gros, le but de ce modèle est d'extraire des caractéristiques pour l'entrée.

RNN AutoEncoder Screenshot from 2017-07-16 23-16-44.png RNN AutoEncoder est modélisé comme ci-dessus et utilise le dernier état de la cellule RNN de l'encodeur. Contrairement à l'AutoEncoder de base, RNN AutoEncoder vise à extraire des fonctionnalités à partir de données séquentielles. Par conséquent, il est possible d'extraire des fonctionnalités de vidéos et de textes.

Implémentation dans Tensorflow

model.py


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

Cette fois, la partie décodeur utilise le module 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)

La partie encodeur ressemble à ceci. ʻEncoder_final_state` est la partie qui correspond à l'objectif.

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

La partie décodeur peut être écrite comme ceci.

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])))

la perte peut être écrite comme ci-dessus. Après cela, vous pouvez alimenter chaque variable de Session et optimiser comme d'habitude.

référence

Cliquez ici pour le papier LSTM AE paper Autoencoder appris avec Keras

Recommended Posts

RNN AutoEncoder
Pratiquez RNN TensorFlow