再帰的ニューラルネットワーク(RNN, LSTM)をTensorFlowを用いて実装しました#2

TensorFlowを使って再帰的ニューラルネットワークを扱うクラスを実装したので晒していきます。今回はTensorFlowを用いてLSTMを実装するという部分について少し深く解説していきます。

LSTMの実装

#1で紹介したクラスのinfer関数を説明用に一部書き換えたものを使って解説をしていきます。

#infer関数の概要

基本的には長さτの時系列データxを引数として受け取り、hidden_dimsで設定した層数を持つLSTMレイヤーに時系列データを流し込むことで予測をするという機能を持っています。

#引数

  • x : 1次元の時系列データ。長さはτ

#関数内のパラメータ

  • hidden_units : 隠れ層の層数(LSTMレイヤー内の層数)
  • batch_size : バッチサイズ
  • tau : 入力データ(時系列データ)の時間的な長さ
  • output_dim : 出力データの次元数
  • state : LSTMレイヤーの状態
  • cell_outputs : LSTMレイヤーの過去の各時間での出力を保存

#tf.contrib.rnn.BasicLSTMCell()

BasicLSTMCell関数に隠れ層の数を引数に渡すことでLSTMのレイヤーを作成します。cellという名前で今回は作成しました。呼び出す関数をBasicRNNCell関数に変えることでLSTMではなくRNNレイヤーに切り替えることもできます。

作成したLSTMレイヤー(cell)はzero_state関数で初期化を行います。

#過去の隠れ層の保存

reuse_variables関数を用いることで、再帰的に学習するのに必要な過去の隠れ層の結果を保存(使いまわし)ができます。最後の出力(cell_outputs[-1])を最終的なoutputとして使用します

#重みとバイアスの設定

最後の出力(output)に対して重みとバイアスの情報を与えます。まずは初期化した重みとバイアスを用意します。重みとバイアスの生成にはinit_weightとinit_bias関数を用います。

init_weight

  • shape : [隠れ層の数,出力データの次元数]

init_bias

  • shape : [出力データの次元数]

生成したバイアスと重みをもとに深層学習におけるy = Wx + bの計算を行います。

まとめ

LSTMをTensorFlowで実装するときは過去の隠れ層を使いまわすことがポイントとなります。TensorFlowの機能でこの使いまわしを実装することが可能です。実装についての質問や直した方がいい点などのコメントなどがあれば遠慮なくお願いします。

次回はLSTMの実装から少し離れてtf.train.Saverの使い方について書こうと思っています。楽しみにしていてください!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top