Keras を使えば LSTM は簡単に構築できます。
構築例を次のソース1に示します。

ソース 1: Keras で (3層)LSTM を構築する例
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に示します(※ 乱数なので実行するたびにグラフの形は変わります)。

図1. 入力信号の例(入力信号数 N=3, 信号長 S=10)

 

次に 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 を使うことも可能です。

この様にして作成したモデルの概要は次の通りです。

ソース 1 で構築した LSTM の概要
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 としていますので最後の時刻の値だけを出力しています。

出力信号の例(出力信号数 M=1, return_sequences=False)

※ 入力が乱数なので実行するたびに値は変わります。

[[-0.05493683]]

仮に return_sequences=True とすると、以下のように全時刻(i=0,1,・・・,9)においてネットワークから出力がされます。

return_sequences=True とした時の出力信号の例

※ 入力が乱数なので実行するたびに値は変わります。

[[[ 0.02156563]
  [ 0.1430859 ]
  [ 0.04868509]
  [-0.04080052]
  [-0.05400606]
  [-0.0736019 ]
  [ 0.03886629]
  [ 0.12875266]
  [ 0.11176284]
  [ 0.06541518]]]