asunasota
@asunasota

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

1Answer

特定の特徴量1つを予測:

現在のコードで問題ありません。

すべての特徴量12個を予測:

すべての特徴量(12個すべて)を予測する場合、出力層のニューロン数を1から12に変更し、教師データの形状も12次元に対応させる必要があります。

教師データの設定

c_data[i] = train_x[i+1:i+n_rnn+1,:]  # 全ての特徴量を対象にする場合

モデルの設計の変更

出力層を次のように変更します:

n_out = 12  # 出力層のニューロン数を12に変更

model.add(Dense(n_out, activation="linear"))
1Like

Comments

  1. @asunasota

    Questioner

    回答頂いありがとうございます。

Your answer might help someone💌