こんにちは、ヒガシです。
このページでは時系列データに強いと言われている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()の結果は以下の通りです。
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()の結果は以下の通りです。
層の扱いが少し違いますが、Total paramsなんかは全く同じになっていますね。
学習結果も先ほど紹介したSequential形式とほぼ同じlossの結果となっていました。
というわけで問題なく実装できていそうですね。
おわりに
というわけで今回はKerasのFunction-API形式にてLSTMモデルを構築する方法をご紹介しました。
複雑なモデル構築の際などにぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント