RNN入门(四)训练RNN预测未来几步的步长


该系列的Jupyter放在下方:

原码点击下载

RNN入门(四)训练RNN预测未来几步的步长

RNN训练速度较慢,请选择算力较强的计算机。

到第三节为止,RNN都只预测了下一个时间步长的值,但是RNN也能够通过更改输入输出,来预测未来几步的值。假设对于前面随机生成的时间序列,我们想要预测接下来的10值:

法一:使用模型预测下一个值,再将该值作为输入,预测下一个时间步长的值

类似于灰色预测模型的新陈代谢法。

np.random.seed(43) # 换一个随机数

n_steps = 50
series = generate_time_series(1, n_steps + 10)  #前50作为训练,后10作为预测比较
X_new, Y_new = series[:, :n_steps], series[:, n_steps:]
X = X_new
for step_ahead in range(10):
    y_pred_one = model.predict(X[:, step_ahead:])[:, np.newaxis, :]
    X = np.concatenate([X, y_pred_one], axis=1)

Y_pred = X[:, n_steps:]

看一下预测结果Y_pred的形状:

Y_pred.shape
(1, 10, 1)

可以看到预测值包含10个步长。

绘制目标值与预测值的图像:

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置
def plot_multiple_forecasts(X, Y, Y_pred):
    n_steps = X.shape[1]
    ahead = Y.shape[1]
    plot_series(X[0, :, 0])
    plt.plot(np.arange(n_steps, n_steps + ahead), Y[0, :, 0], "bo-", label="真实值")
    plt.plot(np.arange(n_steps, n_steps + ahead), Y_pred[0, :, 0], "rx-", label="预测值", markersize=10)
    plt.axis([0, n_steps + ahead, -1, 1])
    plt.legend(fontsize=14)

plot_multiple_forecasts(X_new, Y_new, Y_pred)
save_fig("forecast_ahead_plot")
plt.show()




由于上一时刻的输出会作为这一时刻的输入,所以预测值的误差会不断累积,因此下一步长的预测通常会比未来几个时间步长的预测更准确。

法二:训练RNN,一次性输出10个值

首先重新建立数据集,使数据集的y包含10个步长的值。

np.random.seed(42)

n_steps = 50
series = generate_time_series(10000, n_steps + 10)
X_train, Y_train = series[:7000, :n_steps], series[:7000, -10:, 0]
X_valid, Y_valid = series[7000:9000, :n_steps], series[7000:9000, -10:, 0]
X_test, Y_test = series[9000:, :n_steps], series[9000:, -10:, 0]

重新训练模型,此时输出层包含10个神经元

np.random.seed(42)
tf.random.set_seed(42)

model = keras.models.Sequential([
    keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None, 1]),
    keras.layers.SimpleRNN(20),
    keras.layers.Dense(10)
])

model.compile(loss="mse", optimizer="adam")
history = model.fit(X_train, Y_train, epochs=20,
                    validation_data=(X_valid, Y_valid))

绘制真实值与预测值的差异:

np.random.seed(43)

series = generate_time_series(1, 50 + 10)
X_new, Y_new = series[:, :50, :], series[:, -10:, :]
Y_pred = model.predict(X_new)[..., np.newaxis]
plot_multiple_forecasts(X_new, Y_new, Y_pred)
plt.show()



训练好的模型保存再加载,可能会出现参数错位的问题

比如我在上一个一次性预测10个值的模型里用实验室电脑进行训练,保存再加载到自己的电脑里以后就出现了问题,预测值非常的离谱:




目前我还没有找到出现这种问题的原因。

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - RNN入门(四)训练RNN预测未来几步的步长


Make Everyday Count