【AI】LSTMモデルをKeras-Function-API形式で作成する方法!

こんにちは、ヒガシです。

 

このページでは時系列データに強いと言われているLSTMモデルを、KerasのFunction-API形式で作成する方法をご紹介していきます。

 

LSTMモデルはSequential形式だといろいろと紹介記事が載っていますが、Function-API形式で書かれている記事が少ないため、今回ご紹介しておこうと思います。

 

それではさっそくやっていきましょう。

 

スポンサーリンク

データ生成⇒前処理まで

本題に入る前に、まずはLSTMモデルに入力するためのデータがなければ話になりません。

 

というわけでまずはデータ生成⇒LSTM用の前処理までを一気にご紹介していきます。

import numpy as np
xdeg=1440
x = np.arange(0,xdeg+1)
X1=np.sin(2*np.pi*x/360)+np.random.rand(len(x))/20
X2=np.sin(2*2*np.pi*x/360)+np.random.rand(len(x))/20
X3=np.cos(2*np.pi*x/360)+np.random.rand(len(x))/20
X4=np.cos(2*2*np.pi*x/360)+np.random.rand(len(x))/20
Y1=X1+X2+X3+X4
Y2=X1-X2+X3-X4
X_list=[X1,X2,X3,X4]
Y_list=[Y1,Y2]
Xdata=[]
Ydata=[]
look_back=5
for i in range(len(x)-look_back):
  Xtimedata=[]
  for j in range(len(X_list)):
    Xtimedata.append(X_list[j][i:i+look_back])
  Xtimedata=np.array(Xtimedata)
  Xtimedata=Xtimedata.transpose()
  Xdata.append(Xtimedata)
  Ytimedata=[]
  for j in range(len(Y_list)):
    Ytimedata.append(Y_list[j][i+look_back])
  Ydata.append(Ytimedata)
Xdata=np.array(Xdata)
Ydata=np.array(Ydata)

 

ここは本題とはそれるので詳細解説はしませんが、これでXdata,YdataにLSTMに入れる用のデータが格納されています。

 

print(Xdata.shape)
print(Ydata.shape)

で大きさを確認すると、

(1436, 5, 4)

(1436, 2)

という結果が出力されました。

これが今回使用するデータのサイズですね。

 

なお、今回使用するデータは以下の記事と全く同じです。データ生成部分は今回よりも詳しく書いていますので、詳細を知りたければこちらもあわせてご覧ください。
【AI】複数の入出力を持つデータをLSTMモデルに入力する方法!

 

スポンサーリンク

LSTMモデルをSequential形式で作成した場合

本題であるFunction-API形式でのLSTMモデル構築の紹介に入る前に、今回作成するモデルをSequential形式で書いた場合どんなモデルになるかをご紹介しておきます。
(その方が比較して理解しやすいはずです。)

 

以下がそのコードです。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.optimizers import Adam
Xdim=Xdata.shape[2]
Ydim=Ydata.shape[1]
validation_split_rate=0.2
model = Sequential()
model.add(LSTM(4, input_shape=(look_back,Xdim)))
model.add(Dense(Ydim))
model.compile(loss="mean_squared_error", optimizer=Adam(lr=0.001))
model.summary()
history=model.fit(Xdata,Ydata,batch_size=16,epochs=100,validation_split=validation_split_rate)

 

ここは様々なサイトで紹介されているのとほぼ同じでしょう。

model.summary()の結果は以下の通りです。

Sequential形式でLSTMモデルを作成した際のサマリー

 

スポンサーリンク

LSTMモデルをFunction-API形式で作成する方法

それでは前置きが長くなりましたが、本題であるLSTMモデルをKerasのFunction-API形式で作成する方法をご紹介していきます。

 

以下がそのコードです。

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense,LSTM,Input
from tensorflow.keras.optimizers import Adam
Xdim=Xdata.shape[2]
Ydim=Ydata.shape[1]
validation_split_rate=0.2
input=Input(shape=(look_back,Xdim))
model=LSTM(4)(input)
model=Dense(Ydim)(model)
model=Model(inputs=input,outputs=model)
model.compile(loss="mean_squared_error", optimizer=Adam(lr=0.001))
model.summary()
history=model.fit(Xdata,Ydata,batch_size=16,epochs=100,validation_split=validation_split_rate)

 

model.summary()の結果は以下の通りです。

Function-API形式でLSTMモデルを作成した際のサマリー

層の扱いが少し違いますが、Total paramsなんかは全く同じになっていますね。

 

学習結果も先ほど紹介したSequential形式とほぼ同じlossの結果となっていました。

 

というわけで問題なく実装できていそうですね。

 

スポンサーリンク

おわりに

というわけで今回はKerasのFunction-API形式にてLSTMモデルを構築する方法をご紹介しました。

複雑なモデル構築の際などにぜひご活用ください。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました