Keras を使えば LSTM は簡単に構築できます。
構築例を次のソース1に示します。
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # パーセプトロン/LSTMブロックの数 N = 3 # 入力層 = 入力信号の個数 K = 2 # 隠れ層 (LSTMブロック) M = 1 # 出力層 # 信号長 S = 10 # 入力信号 x = np.random.uniform(low=-1, high=1, size=S*N) data = x.reshape(1,S,N) # LSTMの構築 model = tf.keras.Sequential() model.add( tf.keras.layers.Input(shape=(S,N))) model.add( tf.keras.layers.LSTM( K, return_sequences=False)) model.add( tf.keras.layers.Dense(M, activation='linear') ) # 出力 y = model.predict(data) # モデルの概要表示 model.summary() print('入力') plt.plot(range(S),data[0]) plt.show() print('\n出力') print(y)
では各行の意味について順を追って説明していきたいと思います。
# パーセプトロン/LSTMブロックの数 N = 3 # 入力層 = 入力信号の個数 K = 2 # 隠れ層 (LSTMブロック) M = 1 # 出力層 # 信号長 S = 10
ユニット数や入力信号の個数と長さを設定しています。
# 入力信号 x = np.random.uniform(low=-1, high=1, size=S*N) data = x.reshape(1,S,N)
の部分では入力信号を作成しています。
今回の例では -1〜1 の範囲の一様乱数を S*N = 30 個生成し、reshape関数を使って長さ S = 10 の信号を N = 3 個作りました。
ちなみに reshapeのカッコ内の先頭の数字 1 はデータセットのサイズが L = 1 という意味です。
この様にして作った入力信号の例を図1に示します(※ 乱数なので実行するたびにグラフの形は変わります)。
次に LSTMを構築して値を出力します。
# LSTMの構築 model = tf.keras.Sequential() model.add( tf.keras.layers.Input(shape=(S,N))) model.add( tf.keras.layers.LSTM( K, return_sequences=False)) model.add( tf.keras.layers.Dense(M, activation='linear') ) # 出力 y = model.predict(data)
3行目の model.add( tf.keras.layers.Input〜 ) で入力層(Input)をネットワークに追加しています。
4行目の model.add( tf.keras.layers.LSTM〜 ) で LSTM ブロック をネットワークに追加しています。
引数の return_sequences は LSTM の出力を全時刻において出力するか、最後の時刻の値だけを出力するかを決めるパラメータです(詳しくは下で説明します)。
5行目の model.add( tf.keras.layers.Dense〜 )では全結合層(Dense)のインスタンスを追加しています。
今回の例では活性化関数として「softmax」ではなく「linear」(線形出力)を使っていますが、もちろん softmax を使うことも可能です。
この様にして作成したモデルの概要は次の通りです。
Model: "sequential_14" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm_14 (LSTM) (None, 10, 2) 48 _________________________________________________________________ dense_3 (Dense) (None, 10, 1) 3 ================================================================= Total params: 51 Trainable params: 51 Non-trainable params: 0
ここで 1 つの LSTM ブロックへの入力は入力信号が N=3、フィードバック入力が K=2 の計 5 つなので、LSTM ブロックの入力部のパラメータ数は 6 個(重みx5、バイアスx1)になります。
同様に入力・忘却・出力ゲートのパラメータ数もそれぞれ 6 個なので、LSTMブロック 1 つのパラメータ数は 4*6 = 24 個となります。
従ってソース1のLSTMにはブロックが K=2 つ含まれてますので、合計 24*2 = 48 個のパラメータ数となります。
また出力層は K=2 個のLSTMにかけられる重みとバイアスの計 3 個のパラメータ数となり、ネットワーク全体では 51 個のパラメータ数となります。
ではこのネットワークの出力を以下に示します。
今回の例では model.add( tf.keras.layers.LSTM〜 ) の引数で return_sequences=False としていますので最後の時刻の値だけを出力しています。
※ 入力が乱数なので実行するたびに値は変わります。
[[-0.05493683]]
仮に return_sequences=True とすると、以下のように全時刻(i=0,1,・・・,9)においてネットワークから出力がされます。
※ 入力が乱数なので実行するたびに値は変わります。
[[[ 0.02156563] [ 0.1430859 ] [ 0.04868509] [-0.04080052] [-0.05400606] [-0.0736019 ] [ 0.03886629] [ 0.12875266] [ 0.11176284] [ 0.06541518]]]