Win11 WSL2 Ubuntu Python RNN

WSL2 Python RNN Keras モデルの構築

ここまでで、訓練・検証・テストのデ-タセットの作成・確認ができました。
引き続き、基本的な機械学習モデルを適用して RNN を実行していきます。
Keras にはモデルを構築する方法については、
Keras モデルの構築
大域最適解みつからず
全結合モデル後半作成
コ-ルバックを使用
全結合モデルファイルまとめ[お急ぎの方はこちら①]
を参照してください。
①の後半をコピーして Keras モデルを構築します。


from keras import layers
from keras import initializers

sequence_length = 20
inputs = keras.Input(shape=(sequence_length,))
x = layers.Flatten()(inputs)
x = layers.Dense(
    20,
    activation="tanh",
    kernel_initializer='zeros'
    )(x)
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
print("モデルア-キテクチャ")
print(model.summary())
 
callbacks_list = [
  keras.callbacks.EarlyStopping(
    monitor="val_loss",
    patience=2,
    ),
  keras.callbacks.ModelCheckpoint( 
    "/home/yasuhiro/public_html/colab/jena_dense_l.keras",
    save_best_only=True,
    )
]
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
history = model.fit(
  train_dataset,
  epochs=40,
  # verbose=0,
  validation_data=val_dataset,
  callbacks=callbacks_list)
  
loss = history.history["mae"] # 平均絶対誤差(MAE)
val_loss = history.history["val_mae"]
epochs = range(1, len(loss) + 1)

plt.plot(epochs, loss, "bo", label="Training MAE")
plt.plot(epochs, val_loss, "b", label="Validation MAE")
plt.title("Training and Validation MAE")
plt.legend()
plt.show() 

WSL2 Python RNN Keras 最良モデルでの予測値探求

ここからは予測値を探求していくのですが
ModelCheckpoint コ-ルバック確認
の中でもいろいろ説明しました。 こちらも参考にしてください。
keras.callbacks.ModelCheckpoint メソッドを使用して最も性能の良いモデルを
/home/yamada/public_html/colab/ jena_dense_l.keras
に保存しました。
このモデルを呼び出します。

model = keras.models.load_model(
  "/home/yamada/public_html/colab/jena_dense_l.keras")

WSL2 Python RNN Keras predict メソッド

predict メソッドを使い、これに TensorFlow の Dataset オブジェクト
ここでは、 timeseries_dataset デ-タのなかで作成したテストデ-タセット test_dataset
を指定すると最も性能の良いモデルを使用して予測値が含まれた NumPy 配列を返してくれます。
ただし、この配列は
[
[-0.92330056]
[-0.6659259]
・・・・・
[0.29359224]
]
の様な縦型の配列になっています。
pre = model.predict(test_dataset)
これを横型の配列にして見やすくします、他に目的はありません。
縦型 縦ベクトルの配列に対して reshape(-1)とすると、その配列を要素とする横型 横ベクトルの配列となります。
pre1 = np.reshape(pre, (-1))
print(f"Test 予測値:")
print(pre1)
pre1 の内容を見ると、予測値とは言うものの、最後の値以外は、train_dataset の目的値 targets とほぼ同じ値が確認できるだけです。
何のことはない、やっと1つ先の予測値がわかっただけです。

WSL2 Python RNN Keras 5つ先の予測値

5つ先までの予測値を求めます。
test_dataset の最後の配列を future_test とします。
future_test = inputs_t[-1:]
inputs_t については
各デ-タセットの内容表示/テストデ-タセット表示
を参照してください。
これは 20個のデ-タから構成されており、以下のようになっています。

   
tf.Tensor(
[[1.07924404 0.73935105 0.27871225 0.12273102 0.01745443 0.26496184
  0.31996349 0.3328545  0.53954038 0.46133491 0.57864311 0.38570764
  0.40289566 0.14249724 0.00327432 0.30707248 0.26968854 0.34746431
  0.22371061 0.30965068]], shape=(1, 20), dtype=float64)

そして、future_result は空にしておきます。
future_result = []
それではル-プ5回まわしで予測値を求めます。

  1. for 文作成

    5回まわす for 文を作成します。
    for i in range(5):

  2. future_test 配列形状変換

    future_test 配列を shape=(1, 20, 1) の形状に変換し
    test_data_f = np.reshape(future_test, (1, 20, 1))
    とします。
    test_data_f は test_dataset と同じ配列形状になりました。

  3. 1つ先を予測

    1つ先の予測値 batch_predict を求めます。
    batch_predict = model.predict(test_data_f)

  4. 最も古いデ-タ削除

    20個のデ-タのなかで最も古いデ-タを削除します。
    future_test = np.delete(future_test, 0)
    1個減って future_test は 19個となりました。

  5. 予測したデ-タ追加

    新たに予測した batch_predict を future_test の最後に追加します。
    1個増えて future_test は 20個に戻りました。
    future_test = np.append(future_test, batch_predict)

  6. 予測値を予測結果配列に追加

    予測したデ-タ batch_predict を予測結果配列 future_result に追加します。
    future_result = np.append(future_result, batch_predict)


ここまでをまとめると次のようになります。


model = keras.models.load_model(
  "/home/yasuhiro/public_html/colab/jena_dense_l.keras")
pre = model.predict(test_dataset, verbose=0)
pre1 = np.reshape(pre, (-1))
print(f"Test 予測値:")
print(pre1)

future_test = inputs_t[-1:]
print("future_test 最初の配列値")
print(future_test)
future_result = []
for i in range(5):
  test_data_f = np.reshape(future_test, (1, 20, 1))
  batch_predict = model.predict(test_data_f, verbose=0)
  future_test = np.delete(future_test, 0)
  future_test = np.append(future_test, batch_predict)
  future_result = np.append(future_result, batch_predict)
print("future_result :")
print(future_result)

なお、verbose=0 を追加すると進捗状況報告の
Epoch 1/40
3/3 [===] - 1s 323ms/step - loss: 0.7151 - mae: 0.7040 - val_loss: 0.2704 - val_mae: 0.4150
のような報告が表示されないようになります。

ここまでで5つ先の予測値を求めることができました。
引き続きこの予測値をグラフにプロットしていきます。


  • WSL2 Python RNN Keras 予測値プロット に進む
  • WSL2 Python RNN 検証デ-タセット作成 に戻る
  • Win11 WSL2 Ubuntu Python RNN 概要 に戻る
  • 70VPS に戻る