我們來看一個實際的資料,如下圖:
這是個太陽黑子的活動紀錄資料,從1749年1月到2018年7月,我們可看出資料具有週期性和雜訊。
我們就直接把學過的都用上來,1層convolution加2層LSTM再加2層dense:
# Parameters
window_size = 30
batch_size = 32
shuffle_buffer_size = 1000
# Generate the dataset windows
train_set = windowed_dataset(x_train, window_size, batch_size, shuffle_buffer_size)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv1D(filters=64, kernel_size=3,
strides=1,
activation="relu",
padding='causal',
input_shape=[window_size, 1]),
tf.keras.layers.LSTM(64, return_sequences=True),
tf.keras.layers.LSTM(64),
tf.keras.layers.Dense(30, activation="relu"),
tf.keras.layers.Dense(10, activation="relu"),
tf.keras.layers.Dense(1),
tf.keras.layers.Lambda(lambda x: x * 400)
])
我們用SGD,learning rate設8e-7,loss用Huber,同樣類似昨天的設定:
# Set the learning rate
learning_rate = 8e-7
# Set the optimizer
optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=0.9)
# Set the training parameters
model.compile(loss=tf.keras.losses.Huber(),
optimizer=optimizer,
metrics=["mae"])
訓練時的loss和MAE:
放大100次epoch後的區間,同樣可以看到抖動,但趨勢仍是有往小的方向前進:
測試區間的預測結果:
測試資料的MAE為14.944391。
我試了一些參數調整,並沒有顯著的改善,其中一個拿掉一層LSTM然後調低learning rate至2e-7,測試資料的MAE為14.430293,訓練時的loss和MAE放大100次epoch後的區間,可以看到最後的loss和MAE有略低於上一個設定的:
測試區間的預測結果: