Kerasで単純なRNN(リカレントニューラルネットワーク)を試す

前回はKerasを使って多クラス分類などを行いました。

【ディープラーニング】kerasで多クラス分類 〜irisデータセットを用いて〜
iris = datasets.load_iris()
x = iris.data
y = iris.target 

print(x[0]) # => array([ 5.1,  3.5,  1.4,  0.2]) 0番目の花の情報
print(y[0]) # => 0 # 0番目の花は0クラス

今回はRNN(リカレントニューラルネットワーク)を試してみようと思います。

本記事は最低限のpythonの操作はできることを想定しています。
プログラミングの独学が苦手な方は以下のプログラミングスクールがおすすめです。もしよかったら勉強してみてください。


Kerasとは

Kerasは、ニューラルネットワークを非常にシンプルに構築できるライブラリです。

Home - Keras Documentation
Documentation for Keras, the Python Deep Learning library.

TensorFlow等で書くとかなり長くなってしまうコードがKerasを使うことでシンプルなコードとなります。

ちなみにKerasは下でTensorFlow等が動いています。

RNN(リカレントニューラルネットワーク)とは

RNNとは再帰型ニューラルネットワークとも呼ばれ、
時系列の関係がある入力にも対応できるニューラルネットワークです。

以下はイメージ図、

図からわかるとおり、
現在の入力\({\bf x}\)1つ前の出力\({\bf h}\)を用いることで、入力間の関係性も学習させようというアプローチです。

ちなみに図の右のようにすることをアンロールするといいます。
図の中の\(h_t\)は記憶セルセルと呼び、1つ前の状態の内容(内部状態)を保存します。
\(h_t\)は数式で表現すると次のようになります。

$$\begin{aligned}
h_t = f(h_{t-1}, x_t)
\end{aligned}$$

KearsでRNNを動かしてみる

RNNのサンプルとしてよく用いられるsin波を使ってKerasのRNNを試してみます。

具体的には以下の図のような感じで、

現在から少し前までを見て、次の値を予測するようなものです。

学習・検証用データの作成

numpyを使ってsin波を作成します。

RNN用のデータに加工していきます。

input_lenが入力の長さです。
データとして、i番目からinput_lenまでを入力データ、i+input_len+1を出力データになるようにデータを加工します。

学習と検証用にデータを分けます。
今回は単純に左から8割を学習用、残りの2割を評価用とします。
つまり、以下のような感じです。

実装しましょう。

次に学習するためにデータを成形しておきます。

これで、学習用、検証用のデータができました。

モデルの構築・学習・評価

まずモデルの構築をしていきます。

今回は最もシンプルなRNNを用いるのでSimpleRNN層を用います。
第一引数の100はSimpleRNN層の中の素子数です。
今回は系列を返すのでないので、return_sequences=Falseとしています。
出力は次のステップの値であり、回帰問題となりますので、出力は1です。

では、学習させていきましょう。

上記のコードを実行すると以下のように学習過程を出力します。

グラフからわかるように、誤差を小さくできているようです。

さらに検証用データでモデルの評価を行います。

誤差を小さくできていますね。

具体的にどのように予測しているかを見てみましょう

青が正解データ、オレンジが学習したモデルによる予測値になります。
かなりきれいに予測できています。

ソースコードの全体像

終わりに

今回はKerasを使って最もシンプルなRNNを試してみました。
次はLSTM等を試していこうと思います。

参考文献

  1. 直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ
タイトルとURLをコピーしました