山东大学暑期项目实训——云主机服务比价与预测系统(十五)
使用tensorflow做预测
4.构建模型!!!—进行多时间步长预测
有两种大致的解决方法:
- 一次预测整个时间序列的单发预测。
- 模型仅进行单步预测并且其输出作为其输入反馈的自回归预测。
1)卷积神经网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIuFBtGO-1627623079662)(https://www.tensorflow.org/tutorials/structured_data/images/multistep_conv.png?hl=zh-cn)]
# 多时间步的卷积神经网络预测
def muliCNN():
CONV_WIDTH = 3
multi_conv_model = tf.keras.Sequential([
# Shape [batch, time, features] => [batch, CONV_WIDTH, features]
tf.keras.layers.Lambda(lambda x: x[:, -CONV_WIDTH:, :]),
# Shape => [batch, 1, conv_units]
tf.keras.layers.Conv1D(256, activation='relu', kernel_size=(CONV_WIDTH)),
# Shape => [batch, 1, out_steps*features]
tf.keras.layers.Dense(OUT_STEPS * num_features,
kernel_initializer=tf.initializers.zeros()),
# Shape => [batch, out_steps, features]
tf.keras.layers.Reshape([OUT_STEPS, num_features])
])
history = compile_and_fit(multi_conv_model, multi_window)
IPython.display.clear_output()
multi_val_performance['Conv'] = multi_conv_model.evaluate(multi_window.val)
multi_performance['Conv'] = multi_conv_model.evaluate(multi_window.test, verbose=0)
multi_window.plot(multi_conv_model)
return history
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ne8hwLeL-1627623079668)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210429214447346.png)]
2)RNN递归神经网络
如果循环模型与模型所做的预测相关,则可以学习使用悠久的输入历史。在此,模型将在24小时内累积内部状态,然后为下一个24小时做出单个预测。
在这种单发格式中,LSTM只需要在最后一个时间步上生成输出,因此将其设置为return_sequences=False
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jadP3vX3-1627623079670)(https://www.tensorflow.org/tutorials/structured_data/images/multistep_lstm.png?hl=zh-cn)]
# RNN做多步预测
def muliRNN():
multi_lstm_model = tf.keras.Sequential([
# Shape [batch, time, features] => [batch, lstm_units]
# Adding more `lstm_units` just overfits more quickly.
tf.keras.layers.LSTM(32, return_sequences=False),
# Shape => [batch, out_steps*features]
tf.keras.layers.Dense(OUT_STEPS * num_features,
kernel_initializer=tf.initializers.zeros()),
# Shape => [batch, out_steps, features]
tf.keras.layers.Reshape([OUT_STEPS, num_features])
])
history = compile_and_fit(multi_lstm_model, multi_window)
IPython.display.clear_output()
multi_val_performance['LSTM'] = multi_lstm_model.evaluate(multi_window.val)
multi_performance['LSTM'] = multi_lstm_model.evaluate(multi_window.test, verbose=0)
multi_window.plot(multi_lstm_model)
return history
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zialXG0e-1627623079673)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210429214614441.png)]
三、RNN(Recurrent Neural Network递归神经网络的结构详解)
----最适合处理自然语言处理
便于处理序列化的数据;
前后文数据关联性很大(时间,语言)
1.普通神经网络的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yT623utw-1627623079675)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430151010452.png)]
存在的缺点:训练数据之间没有任何影响,相互独立。
2.RNN的网络结构
基本结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnOHKw4s-1627623079676)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430151331343.png)]
隐藏层中存在一个递归(循环),保存上一次的训练数据的中间输出结果,于是每个训练数据都与前面的训练数据存在依赖。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6AgJH3g-1627623079677)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430151547405.png)]
充分利用上一次训练数据的信息。
反向传播
只要相连的都需要进行梯度更新,每进行一步都需要进行更新;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APq1y5zm-1627623079678)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430152549825.png)]
存在问题:
- 计算量大,需要记录所有的数据,但是只有靠的近的数据价值很大
- 计算过程中可能存在梯度消失和梯度爆炸的问题
3.LSTM长短期记忆(Long Short-Term Memory, 简称 LSTM)
1)基本结构:
每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表按位 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zi2mYoMu-1627623079679)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430153953710.png)]
C控制参数:
决定了什么样的信息会被保留什么样的会被遗忘;
该参数需要学习,x–门,
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid
神经网络层和一个按位的乘法操作。Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1就指“允许任意量通过”!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pH1ReAH-1627623079679)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430153731978.png)]
LSTM 拥有三个门,来保护和控制细胞状态。
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 h t − 1 h_{t-1} ht−1 和 x t x_t xt,输出一个在 0 到 1之间的数值给每个在细胞状态 C t − 1 C_{t-1} Ct−1 中的数字。 1表示“完全保留”,0 表示“完全舍弃”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dETGc1zG-1627623079680)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430154318781.png)]
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid
层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh
层创建一个新的候选值向量,
C
~
t
\tilde{C}_t
C~t,会被加入到状态中。
现在是更新旧细胞状态的时间了, C t − 1 C_{t-1} Ct−1 更新为 C t C_t Ct.
我们把旧状态与 f t f_t ft 相乘,丢弃掉我们确定需要丢弃的信息。接着加上 i t ∗ C ~ t i_t * \tilde{C}_t it∗C~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5tnOQph-1627623079680)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430154542455.png)]
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid
层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh
进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid
门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjI45hcN-1627623079681)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210430155540567.png)]