Python Colaboratory Ⅳ
LSTM(Long Short Term Memory)の実現
ここまで、LSTM の概要について説明してきました。
引き続き Keras で LSTM を実現する方法について考えていきます。
Keras で LSTM を実装するには、次の手順が必要になります。
① CSV 時系列デ-タの読込
② 時系列デ-タの標準化
③ 3種の timeseries_dataset デ-タの作成
訓練デ-タセット train_dataset
検証デ-タセット val_dataset
テストデ-タセット test_dataset
④ Keras LTSM モデルの構築
⑤ コ-ルバック作成
⑥ compile メソッド
⑦ fit メソッド
⑧ 損失曲線表示
⑨ 5つ先の予測値
①~⑧ の具体的内容は
RNN の理解-Ⅱ
~
予測値表示の結果確認
を読んでいただくと理解できるのですが、かなり長文です。
みなさんお忙しいでしょうから ①~③をまとめたファイル
keras-test-51.ipynb
はコピ-して使用しますので
各デ-タセットの内容表示
を見て、まずは keras-test-51.ipynb のファイル内容を確認してください。
④~⑧についてはこれから順次説明していきます。
⑨はほぼコピ-して使用します。
LSTM モデルの構築
LSTM モデルを構築していきます。
- モジュ-ル
必要なモジュ-ルは3つです。
from tensorflow import keras
from keras import layers
from keras import initializers
- Input 宣言
inputs = keras.Input(shape=(sequence_length, 1))
input デ-タの配列がどんな型式になっているか宣言します。
今回は、sequence_length=20 個の配列が入力されると宣言しています。
この inputs オブジェクトには、このモデルが処理するデ-タの形状とデ-タ型に関する情報が 含まれています。
このようなオブジェクトをシンボリックテンソルと呼びます。
シンボリックテンソルとは、実際のデ-タは含んでいないテンソルのことであり、 モデルを使うときにモデルに渡される実際のテンソルの仕様を定義しています。
sequence_length = 20
inputs = keras.Input(shape=(sequence_length, 1))
inputs は 101個のデ-タを 20個(sequence_length)組にした時系列デ-タであり、 これに対して各1個の目的値があので、 上記のように Input デ-タの shape を指定する必要があります。 - Dense 層1 の規定
Dense 層1 を規定します。
引数は units(出力次元数)です。
その層から出力される次元数を正の整数値で指定します。
ざっくり言えばニューロンの数と考えて良いです。
今回の場合は、20 個の配列が入力されるので Dense 層は 20 本出力することにしました。
16,20,32 あたりを設定することが多いようです。
units = 20 とします。
sequence_length の値と同じにしました。
20個のデータを出力するのでこの層は 20次元となります。
x = layers.LSTM(20)(inputs)
LSTM の場合、活性化関数はデフォルトで tanh が指定されます。
追加で、kernel_initializer(重みの初期化の方法)も使用します。
zeros:すべてを0に初期化
ones : すべてを1に初期化
これはどちらにするか難しいです。
運しだいです。
失敗すると大域最適解が見つかりません。
今回は
kernel_initializer='zeros'
とします。
kernel_initializer='ones'
は止めました。
'zeros' の方がうまく行く確率が高いようです。
Dense 層1をまとめると次のようになります。x = layers.LSTM(20, kernel_initializer='zeros')(inputs)
- Dense 2 の規定
Dense 層2 は Outputs(出力層)です。
LSTM の場合、この層には活性化関数を設定せず、単に units(出力次元数)を1とするだけが一般的なようです。
outputs = layers.Dense(1)(x)
- モデル確定
モデルを確定します。
model = keras.Model(inputs, outputs)
モデルがどのようにできたか見ることができます。
print(model.summary())
LSTM モデルまとめ
ここまでをまとめます。
# lstm-test-1.ipynb from tensorflow import keras from keras import layers from keras import initializers sequence_length = 20 inputs = keras.Input(shape=(sequence_length, 1)) x = layers.LSTM(20, kernel_initializer='zeros')(inputs) outputs = layers.Dense(1)(x) model = keras.Model(inputs, outputs) print("モデルア-キテクチャ") print(model.summary())
コ-ルバックを使用
コ-ルバック設定をします。
- EarlyStopping
EarlyStopping コ-ルバックを使うと検証デ-タでの損失値が改善されなくなった時点で、 訓練を中止することができます。
第1引数には監視する損失関数名 loss の値 val_loss を指定します。
monitor="val_loss"
第2引数には悪化回数を設定します。
patience=2
今回は2回を設定しました。 - ModelCheckpoint
ModelCheckpoint コ-ルバックを使うと最も性能の良いモデルを保存することができます。
第1引数には保存用ファイル名 jena_lstm.keras を設定します。
保存フォルダは Google ドライブ \Colab Notebooks の中に \my_data を作成しておきます。
save_best_only=True
とするとベストモデルが保存されます。
以上、2つのコ-ルバックをまとめ callbacks_list とすると次のようになります。
# lstm-test-2.ipynb callbacks_list = [ keras.callbacks.EarlyStopping( monitor="val_loss", patience=2, ), keras.callbacks.ModelCheckpoint( "drive/MyDrive/Colab Notebooks/my_data/jena_lstm.keras", save_best_only=True, ) ]
ここまでで、LSTM モデルの構築前半が完了しました。
引き続き、compile メソッドで学習プロセスを設定します。