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回まわしで予測値を求めます。
- for 文作成
5回まわす for 文を作成します。
for i in range(5): - future_test 配列形状変換
future_test 配列を shape=(1, 20, 1) の形状に変換し
test_data_f = np.reshape(future_test, (1, 20, 1))
とします。
test_data_f は test_dataset と同じ配列形状になりました。 - 1つ先を予測
1つ先の予測値 batch_predict を求めます。
batch_predict = model.predict(test_data_f) - 最も古いデ-タ削除
20個のデ-タのなかで最も古いデ-タを削除します。
future_test = np.delete(future_test, 0)
1個減って future_test は 19個となりました。 - 予測したデ-タ追加
新たに予測した batch_predict を future_test の最後に追加します。
1個増えて future_test は 20個に戻りました。
future_test = np.append(future_test, batch_predict) - 予測値を予測結果配列に追加
予測したデ-タ 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つ先の予測値を求めることができました。
引き続きこの予測値をグラフにプロットしていきます。