Python
DeepLearning
深層学習
TensorFlow
More than 1 year has passed since last update.

間違いがあれば指摘をおねがいします。

そもそもAutoEncoderとは

教師なし学習の一つで、入力データと同じデータをNNの出力から得られるようにします。
auto_encoder_model_from_wiki
上記の図のようにクビレたモデルになっており、実際に使うのは中間層だけです。
ざっくり言えば、このモデルの目的は入力に対する特徴を抽出することです。

RNN AutoEncoder

Screenshot from 2017-07-16 23-16-44.png
RNN AutoEncoderは上記のようなモデルになっておりEncoderのRNN Cellの最後のステートを使います。
RNN AutoEncoderは基本的なAutoEncoderとは違いシーケンシャルデータからの特徴抽出を目的とします。
そのため動画や、テキストからの特徴抽出をすることが可能になります。

Tensorflow での実装

model.py
import tensorflow as tf
import tensorflow.contrib.seq2seq as seq2seq

今回デコーダ部分は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)

encoder部分はこのように。
encoder_final_stateが目的にあたる部分です。

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

decoder部分は、このように書くことが出来ます。

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

lossは上記のように書けます。
あとは何時ものようにSessionから各変数にfeedしてoptimizeしていけばokです。

参考

論文はこちら LSTM AE paper
Kerasで学ぶAutoencoder