RNNの実装について
解決したいこと
下記のようなコードを用いてRNNを作成中なのですが、いくつか疑問点がありますので、わかる範囲で答えていただけますた幸いです。
・入力値は特徴量12で、教師データはワンステップ先の入力値のうちの特定の特徴量1つだけとしているのですが、下記のコードで問題ないでしょうか。
・入力値が特徴量12の予測のコードをどう書けばよいか分かりません。
使用しているコード
dataset = np.column_stack((y_1t,y_5t,y_8t,y_9t,y_10t,y_11t,y_12t,y_13t,y_14t,y_15t,y_16t,y_17t)).reshape(-1, 12)
train_x = dataset[0:-42,:]
test_x = dataset[-42:-18,:]
n_rnn = 24 # 時系列の数
n_sample = len(train_x)-n_rnn # サンプル数
i_data = np.zeros((n_sample, n_rnn,12)) # 入力
c_data = np.zeros((n_sample, n_rnn,1)) # 正解
for i in range(0,n_sample):
i_data[i] = train_x[i:i+n_rnn,:]
c_data[i] = train_x[i+1:i+n_rnn+1,0].reshape(-1, 1) # 時系列を入力よりも一つ後にずらす
print(c_data)
i_data = i_data.reshape(n_sample, n_rnn, 12) # KerasにおけるRNNでは、入力を(サンプル数、時系列の数、入力層のニューロン数)にする
c_data = c_data.reshape(n_sample, n_rnn, 1) # 今回は入力と同じ形状
batch_size = 15 # バッチサイズ
n_in = 12 # 入力層のニューロン数
n_mid = 20 # 中間層のニューロン数
n_out = 1 # 出力層のニューロン数
# モデルの設計
model = keras.Sequential()
# SimpleRNN層の追加。return_sequenceをTrueにすると、時系列の全てのRNN層が出力を返す。
# return_sequenceをTrueをFalseにすると、最後のRNN層のみが出力を返す。
model.add(SimpleRNN(n_mid, input_shape=(n_rnn, n_in), return_sequences=True))
model.add(Dense(n_out, activation="linear"))
model.compile(loss="mean_squared_error", optimizer="sgd") # 誤差は二乗誤差、最適化アルゴリズムはSGD
history = model.fit(i_data, c_data, epochs=100, batch_size=batch_size, validation_split=0.1)
loss = history.history['loss']
vloss = history.history['val_loss']
0