Python RNN,LSTM,GRUサンプルコード:時系列情報を予測するAIプログラム【Keras,ディープラーニング,Raspberry Pi】

 久々の投稿です。前回の投稿は、もう春ごろになってしまいましたね。あれから新型コロナで、働き方も大きく様変わりしました。仕事の内容自体は変わってはいないのですが、テレワーク中心になったおかげで家でも仕事を意識する時間が増えたような?

さて以前まで主にAI関連の記事を中心に書いてましたが、あの後も時間を見つけてAIのテキスト・動画コンテンツでちょくちょく勉強してました。本ブログでは、全結合層ディープニューラルネットワークや、畳み込みニューラルネットワークを用いて予測や画像認識を行うAIのプログラムを紹介してきました。

AIにもいろいろなタイプがあるのですが、今回は直近に勉強した、時系列情報を扱うタイプである再帰型ニューラルネットワーク(RNN:Recurrent Neural Network)について、取り上げます。

再帰型ニューラルネットワーク(RNN:Recurrent Neural Network)

再帰型ニューラルネットワーク(以下、RNN)について簡単に触れておきます。RNNは、ニューラルネットワーク(ディープラーニング)の1種で、時系列(過去のデータ)情報をもとに、次の結果を予測することを得意としています。チャットボットのような自然言語処理システムで、よく用いられています。

RNNの構造について簡単に説明すると、中間層にフィードバック(再帰)ループが設けられていることが大きな特徴です。ある中間層の入力に、過去のその中間層の出力が入ってくる形をとっています。これにより、過去の中間層出力(予測情報)を加味した、予測結果を得ることができます。

さらに、RNNにもいくつかの型があります。

(1)中間層に単純なフィードバックループを持つRNN(SimpleRNN)
(2)(1)に比べ長期の時系列情報を扱える、LSTM(Long short-term memory)
(3)LSTMを簡略化した、GRU(Gated recurrent unit)

主に知られているのが上記の3つです。RNNについての詳細は以下の本などが参考になります。

はじめてのディープラーニング2 Pythonで実装する再帰型ニューラルネットワーク,VAE,GAN Kindle版

本記事では、(1)(2)(3)の3タイプのRNNを用いたAI予測プログラムを紹介します。

時系列情報を学習・予測させるということで、何を対象にするかですが、ここでは例としてある月の日ごとの平均気温を対象にして、予測を行ってみます。

開発環境

■ハードウェア

・Raspberry Pi 

【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品

■OS

・Raspbian GNU/Linux 9.13 (stretch)

■プログラミング言語、主なライブラリとバージョン

・Python 3.5.3
・Keras 2.3.1
・numpy 1.18.3
・theano 1.0.4
・matplotlib 3.0.3
・pandas 0.25.3

※ラズパイのAI環境開発は以下の本が参考になります。

カラー図解 Raspberry Piではじめる機械学習 基礎からディープラーニングまで (ブルーバックス) Kindle版

プログラム

GitHubにサンプルプログラムを公開します。
https://github.com/kotetsu99/rnn

■各プログラム等の概要

(1)01-simple_rnn_train.py: SimpleRNN学習プログラム
・SimpleRNN(1層)を用いた学習モデルを生成。

(2)02-lstm_train.py: LSTM学習プログラム
・LSTM(1層)に用いた学習モデルを生成。

(3)03-gru_train.py: GRU学習プログラム
・GRU(1層)を用いた学習モデルを生成。

(4)04-rnn_predict: 予測プログラム
・使用する学習モデルを指定して、予測結果を出力。

(5)dataset: データセット保存ディレクトリ
以下のcsvデータセットファイルを保存
 ・train.csv(学習用データ)
 ・predict.csv(予測用データ) ⇒train.csvの最初の一部のデータが保存。

(6)model: 学習モデル保存ディレクトリ

プログラム使用方法


(1)SimpleRNN学習プログラムの実行

以下のコマンドを実行します。

$ python3 01-simple_rnn_train.py model/simple_rnn_model.h5

ここでプログラムの引数として、学習モデルの保存先ファイルパス名を渡す必要があります。コマンド実行後に、学習が始まります。プログラムが終了すると、指定したパスに学習モデルが保存されています。

(2)LSTM学習プログラムの実行

以下のコマンドを実行します。

$ python3 02-lstm_train.py model/lstm_model.h5

(1)と同じく、引数に学習モデル名を渡します。LSTMモデルとして他と区別できるように命名します。

(3)GRU学習プログラムの実行

以下のコマンドを実行します。

$ python3 03-gru_train.py model/gru_model.h5

(1)と同じく、引数に学習モデル名を渡します。GRUモデルとして他と区別できるように命名します。

(4)予測プログラムの実行

以下のコマンドを実行します。

$ python3 03-gru_train.py model/simple_rnn_model.h5 dataset/temp/predict.csv

ここでは引数を2つ指定して実行する必要があります。1つ目は(1)(2)(3)で生成したいずれかの学習モデル。2つ目は予測に使用する、入力データセットです。このpredict.csvは学習用データtrain.csvの最初の数データが保存されています。

これを入力データとして、後続するデータを予測させます。予測結果は以下のデータで出力されます。
・result.csv: 予測データを保存したCSVファイル
・result_figure.png: 学習データ(train)と予測データ(predict)を合わせて、グラフ上でプロット。

SimpleRNN、LSTM、GRU それぞれの予測結果をグラフ(result_figure.png)で確認してみます。

学習データセットとして、2020年7月の東京都の平均気温を使用しています。データは気象庁のサイトから確認できます。(https://www.data.jma.go.jp/obd/stats/etrn/index.php

SimpleRNN

LSTM

GRU

いずれも、エポック数1000回で学習させたものになります。trainが学習データで、predictが各モデルが予測したデータです。最初の7日間の平均気温値は、AIへの初期入力データであり、これはtrainの最初の7日間のデータを流用しています。AIが予測値を出しているのは、8日目以降のデータとなります。

3つを比較すると、LSTMが一番元の学習データ(正解)に近い結果を出しているようです。最も複雑な構造をしているRNNのタイプである分、精度も高いようです。また今回は中間層数=1、中間層ニューロン数=20で行きましたが、これらの値を増やせばもっと精度が出ると思います。

プログラムの使用方法については以上です。各プログラムの解説は以下の記事にアップしました。
https://nine-num-98.blogspot.com/2020/08/ai-rnn-02.html

スポンサーリンク