##行ったこと
時系列予測についてRNNとLSTMの比較が行えるように実装を行った。
中間層の調整や入力時系列の長さを変えるなど行いましたが、同様の結果となってしまった。
##問題点
予測値があまりにも見当違いの値となってしまっている(波形を追うこともできていない)。
→学習がうまく行えていないのではないかと考えた。
→プログラムそのもののミスがあるかもしれないのですが、エラーは一切出ておりません。
##実現したいこと
ある1つの時系列波形を学習し予測を行うこと。
python
1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4from sklearn import model_selection 5 6#データの取得(書き換え) 7data1 = pd.read_csv('C:/***/***.csv') 8 9x_data = data1.loc[0:8020:10,['num']].values 10Fz_data = data1.loc[0:8020:10,['data']].values 11 12plt.plot(x_data, Fz_data) 13plt.show() 14 15n_rnn = 10 #時系列の数(長さ) 16n_sample = len(x_data) - n_rnn #サンプル数 17x = np.zeros((n_sample, n_rnn)) #入力 18t = np.zeros((n_sample,)) #正解、最後の時刻のみ 19 20for i in range(0, n_sample): 21 x[i] = Fz_data[i:i+n_rnn].T 22 t[i] = Fz_data[i+n_rnn] #入力の時系列より1つ後の値 23 24x = x.reshape(n_sample, n_rnn, 1) #(サンプル数、時系列の数、入力層のニューロン数) 25print(x.shape) 26t = t.reshape(n_sample, 1) #(サンプル数、入力層のニューロン数) 27print(t.shape) 28 29#-------------------------------------------------# 30#モデルの構築 31from keras.models import Sequential 32from keras.layers import Dense, SimpleRNN, LSTM 33 34batch_size = 128 #バッチサイズ 35n_in = 1 #入力層のニューロン数 36n_mid = 100 #中間層のニューロン数 37n_out = 1 #出力層のニューロン数 38 39#比較の為の通常のRNN 40model_rnn = Sequential() 41model_rnn.add(SimpleRNN(n_mid, input_shape=(n_rnn, n_in), return_sequences=False)) #最後の出力のみ使用 42model_rnn.add(Dense(n_out, activation="linear")) 43model_rnn.compile(loss="mean_squared_error", optimizer="sgd") 44print(model_rnn.summary()) 45 46#LSTM 47model_lstm = Sequential() 48model_lstm.add(LSTM(n_mid, input_shape=(n_rnn, n_in), return_sequences=False)) #最後の出力のみ使用 49model_lstm.add(Dense(n_out, activation="linear")) 50model_lstm.compile(loss="mean_squared_error", optimizer="sgd") 51print(model_lstm.summary()) 52 53#-------------------------------------------------# 54#学習 55 56from keras.callbacks import EarlyStopping 57import time 58 59epochs = 100 60 61early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=1) 62#通常のRNN 63start_time = time.time() 64history_rnn = model_rnn.fit(x, t, epochs=epochs, batch_size=batch_size, verbose=1, callbacks=[early_stopping]) #verbose=1とすると学習過程が見られる 65print("学習時間 --RNN--:", time.time() - start_time) 66 67#LSTM 68start_time = time.time() 69history_lstm = model_lstm.fit(x, t, epochs=epochs, batch_size=batch_size, verbose=1, callbacks=[early_stopping]) 70print("学習時間 --LSTM--:", time.time() - start_time) 71 72#-------------------------------------------------# 73#学習の推移 74 75loss_rnn = history_rnn.history['loss'] 76loss_lstm = history_lstm.history['loss'] 77 78plt.plot(np.arange(len(loss_rnn)), loss_rnn, label='RNN') 79plt.plot(np.arange(len(loss_lstm)), loss_lstm, label='LSTM') 80plt.legend() 81plt.show() 82 83#-------------------------------------------------# 84#学習済みモデルの使用 85predicted_rnn = x[0].reshape(-1) 86predicted_lstm = x[0].reshape(-1) 87in_rnn = x[0].reshape(-1) 88in_lstm = x[0].reshape(-1) 89 90for i in range(0, n_sample): 91 y_rnn = model_rnn.predict(predicted_rnn[-n_rnn:].reshape(1, n_rnn, 1)) 92 predicted_rnn = np.append(predicted_rnn, y_rnn[0][0]) 93 94 y_lstm = model_lstm.predict(predicted_lstm[-n_rnn:].reshape(1, n_rnn, 1)) 95 predicted_lstm = np.append(predicted_lstm, y_lstm[0][0]) 96 97#plt.plot(np.arange(len(y_test)), y_test, label="Training data") 98plt.plot(np.arange(len(predicted_rnn)), predicted_rnn, label="Predicted_RNN") 99plt.plot(np.arange(len(predicted_lstm)), predicted_lstm, label="Predicted_LSTM") 100plt.plot(np.arange(len(in_rnn)), in_rnn, label="input_RNN0") 101plt.plot(np.arange(len(in_lstm)), in_lstm, label="input_LSTM0") 102plt.legend() 103plt.show()
##使用環境
python3.6
##説明不足があれば解答いたします。
ご指摘よろしくお願いいたします。
あなたの回答
tips
プレビュー