今回やること
時系列系のニューラルネットワークといえば、LSTM・GRUがぱっと思いつきます。今回はこれらをぱっと動かしてみたいと思います。
データセット準備
sin波作成
今回使う時系列データとしてノイズありのsin波を生成します。
import numpy as np
data_num = 500
num = np.linspace(0, 4*np.pi, data_num)
data = np.sin(num) #sin波作成
noise = np.random.normal(-0.1, 0.1, num.shape)
noise_data = data + noise #ノイズ有りsin波作成
import matplotlib.pyplot as plt
plt.plot(num, noise_data, label="noise sin")
plt.plot(num, data, label="sin")
plt.legend(bbox_to_anchor=(1, 1), loc='upper right')
データセット作成
今回はt0,t1,t2...t48,t49
の連続した50のデータから一つ先のt50
を予測する想定で行います。
X_num = 50
X, y = [], []
for i in range(data_num-X_num):
X_i = noise_data[i:i+X_num]
y_i = noise_data[i+X_num]
X.append(X_i)
y.append(y_i)
X = np.array(X)
y = np.array(y)
X = X.reshape([X.shape[0], X.shape[1], 1])
y = y.reshape([y.shape[0], 1])
LSTM
モデル構築
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential
model = Sequential()
model.add(LSTM(128, return_sequences=False, dropout=0.2))
model.add(Dense(1, activation="linear"))
model.compile(loss="mean_squared_error", optimizer="adam")
学習
model.fit(X, y, batch_size=128, epochs=15)
予測
y_predict = model.predict(X)
y_predict = y_predict.flatten()
plt.plot(num, noise_data, label="raw")
plt.plot(num[X_num:], y_predict, label="predict")
plt.legend(bbox_to_anchor=(1, 1), loc='upper right')
GRU
モデル構築
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import GRU
from keras.models import Sequential
model = Sequential()
model.add(GRU(128, return_sequences=False, dropout=0.2))
model.add(Dense(1, activation="linear"))
model.compile(loss="mean_squared_error", optimizer="adam")
学習
model.fit(X, y, batch_size=128, epochs=15)
予測
y_predict = model.predict(X)
y_predict = y_predict.flatten()
plt.plot(num, noise_data, label="raw")
plt.plot(num[X_num:], y_predict, label="predict")
plt.legend(bbox_to_anchor=(1, 1), loc='upper right')