“AI” How to Construct LSTM Model with Multiple Input & Output Dimension.

AI
higashi
higashi

Hi, I’m higashi.

 

In this page, I introduce how to construct LSTM model that has multiple input and output dimension by using tensorflow-keras.

 

OK, let’s get started!!

 

Sponsored Links

Prepare Sample Data for AI Model

At first, let’s prepare sample data to construct LSTM model.

This time, I use easy SIN & COS wave data for input (total 4 data) and composite wave of these for output (total 2 data) .

 

Below is the sample code of construct base wave data.

import numpy as np
xdeg=1440
x = np.arange(0,xdeg+1)
sinx=np.sin(2*np.pi*x/360)+np.random.rand(len(x))/20
sin2x=np.sin(2*2*np.pi*x/360)+np.random.rand(len(x))/20
cosx=np.cos(2*np.pi*x/360)+np.random.rand(len(x))/20
cos2x=np.cos(2*2*np.pi*x/360)+np.random.rand(len(x))/20

These wave data has total 0~1440 degree and it is per 1 degree.

 

Let’s confirm inside of “sinx”.

Inside of sample data

It is 1 dimension data like this.

 

The prerequisite of sample code shown after is all data is one dimension.

 

Anyway, let’s construct input and output data for LSTM model.

X1=sinx
X2=cosx
X3=sin2x
X4=cos2x
Y1=X1+X2+X3+X4
Y2=X1-X2+X3-X4

X1~X4 is used as input and Y1,Y2 is used as output in LSTM model.

 

Let’s make figure of these data.

import matplotlib.pyplot as plt
plt.plot(range(0, len(x)), X1, color="b", label="X1")
plt.plot(range(0, len(x)), X2, color="r", label="X2")
plt.plot(range(0, len(x)), X3, color="g", label="X3")
plt.plot(range(0, len(x)), X4, color="y", label="4")
plt.legend()
plt.show()
plt.plot(range(0, len(x)), Y1, color="b", label="Y1")
plt.plot(range(0, len(x)), Y2, color="r", label="Y2")
plt.legend()
plt.show()

★Input Data (X1~X4))

plot of input data

★Output Data (Y1,Y2)

plot of output data

higashi
higashi

OK, data prepare is finished.

Sponsored Links

Pre-Process Data for LSTM model

Next, let’s conduct pre-process data for LSTM model.

 

Input data is time series data of X1~X4 and output data is next one time data of Y1,Y2.

This time, number of time series data is 5 (set in “look_back”) .

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)

By conduct this program, input data is stored in “Xdata” and output data is stored in “Ydata” and LSTM model can receive as it is.

 

Sponsored Links

Construct LSTM Model has Multiple In-Out Dimension

OK, let’s construct LSTM model by using prepared data above.

 

The sample code is below.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
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)

Learning started like this.

history at model learning

 

I think you can understand how to construct LSTM model has multiple input and output dimension.

 

Sponsored Links

Confirm Model Loss and Prediction Accuracy

On the occasion, let’s confirm model loss and prediction accuracy.

At first, below is the code for plot of model loss.

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

plot of loss

I think you can confirm loss decrease without a problem.

 

Next is confirm prediction accuracy.

The data that is not used as learning data is used for prediction accuracy.

Xdata_validation=Xdata[-int(len(Xdata)*(validation_split_rate)):]
Ydata_validation=Ydata[-int(len(Ydata)*(validation_split_rate)):]
Predictdata = model.predict(Xdata_validation)
plt.plot(range(0, len(Predictdata)),Predictdata[:,0], color="b", label="predict")
plt.plot(range(0, len(Ydata_validation)),Ydata_validation[:,0], color="r", label="row_data")
plt.legend()
plt.show()

result of prediction accuracy

This is also no problem.

 

That’s all. Thank you!!

 

コメント