本篇詳細介紹 RNN 並使用它進行時間序列預測
傳統神經網絡(DNN)無法對時間序列建模,上層神經元的輸出只能傳遞給下層神經元。
而在遞歸神經網絡(RNN)中,神經元的輸出在下一時刻是可以傳遞給自身的,同時還輸出一個隱藏層狀態,給當前層在處理下個樣本時使用,可以看成是自循環反饋的全連接神經網絡。當任務的時序信息很重要(樣本中前後輸入的信息是有關聯的),就很適用使用 RNN 家族的模型
激活函數為神經元引入非線性因素,使神經網絡可以逼近任意非線性函數,這樣神經網絡就可以應用到眾多的非線性模型中。
常見的激活函數有 sigmoid、tanh、relu、softmax:
sigmoid
將取值為(−∞,+∞)的數據映射到(0,1)之間,
取 −∞ 的時候映射為 0,取 +∞ 的時候映射為 1,取 0 的時候映射為 0.5。
一階導數取值範圍為 0~0.25,
數據越趨近 0,導數越趨於 0.25,數據越趨近 ∞,導數越趨於 0。
tanh
相比於 sigmoid 函數,tanh 函數是關於 0 中心對稱的。
將取值為(−∞,+∞)的數據映射到(-1,1)之間,
取 −∞ 的時候映射為 -1,取 +∞ 的時候映射為 1,取 0 的時候映射為 0。
一階導數取值範圍為 0~1,
數據越趨近 0,導數越趨於 1,數據越趨近 ∞,導數越趨於 0。
relu
relu 函數則是為了解決神經網絡中梯度消失的問題,是深度學習中使用最廣泛的激活函數。
softmax
歸一化指數函式,將一個含任意實數的 K 維向量「壓縮」到另一個 K 維實向量中,使得每一個元素的範圍都在 (0, 1) 之間
使用公共自行車某個站點可借車輛數量的數據,顆粒度為每分鐘一筆。
透過神經網絡訓練捕捉時序特徵,預測下個時間點會有多少可借車輛數量
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(98)
import time
import csv
import tensorflow as tf
from tf.keras import Sequential
from tf.keras.layers import Dense, Activation, Dropout, RNN
with open(path_to_dataset) as f:
data = csv.reader(f, delimiter=';')
bike = []
for line in data:
try:
bike.append(float(line[0]))
except ValueError:
pass
def model():
model = Sequential()
model.add(RNN(128))
model.add(Dropout(0.2))
model.add(Dense(10))
model.summary()
(還在更新中)