tf教程4: 因果卷積+LSTM預(yù)測(cè)時(shí)序數(shù)據(jù)

  • 導(dǎo)入所需的包
!pip install tf-nightly-2.0-preview
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
print(tf.__version__)
  • 構(gòu)造人工時(shí)序數(shù)據(jù)
def plot_series(time, series, format="-", start=0, end=None):
    plt.plot(time[start:end], series[start:end], format)
    plt.xlabel("Time")
    plt.ylabel("Value")
    plt.grid(True)

def trend(time, slope=0):
    return slope * time

def seasonal_pattern(season_time):
    """Just an arbitrary pattern, you can change it if you wish"""
    return np.where(season_time < 0.4,
                    np.cos(season_time * 2 * np.pi),
                    1 / np.exp(3 * season_time))

def seasonality(time, period, amplitude=1, phase=0):
    """Repeats the same pattern at each period"""
    season_time = ((time + phase) % period) / period
    return amplitude * seasonal_pattern(season_time)

def noise(time, noise_level=1, seed=None):
    rnd = np.random.RandomState(seed)
    return rnd.randn(len(time)) * noise_level

time = np.arange(4 * 365 + 1, dtype="float32")
baseline = 10
series = trend(time, 0.1)  
baseline = 10
amplitude = 40
slope = 0.05
noise_level = 5

# Create the series
series = baseline + trend(time, slope) + seasonality(time, period=365, amplitude=amplitude)
# Update with noise
series += noise(time, noise_level, seed=42)

split_time = 1000
time_train = time[:split_time]
x_train = series[:split_time]
time_valid = time[split_time:]
x_valid = series[split_time:]

window_size = 20
batch_size = 32
shuffle_buffer_size = 1000
  • 輔助函數(shù)
def windowed_dataset(series, window_size, batch_size, shuffle_buffer):
    series = tf.expand_dims(series, axis=-1)
    ds = tf.data.Dataset.from_tensor_slices(series)
    ds = ds.window(window_size + 1, shift=1, drop_remainder=True)
    ds = ds.flat_map(lambda w: w.batch(window_size + 1))
    ds = ds.shuffle(shuffle_buffer)
    ds = ds.map(lambda w: (w[:-1], w[1:]))
    return ds.batch(batch_size).prefetch(1)

def model_forecast(model, series, window_size):
    ds = tf.data.Dataset.from_tensor_slices(series)
    ds = ds.window(window_size, shift=1, drop_remainder=True)
    ds = ds.flat_map(lambda w: w.batch(window_size))
    ds = ds.batch(32).prefetch(1)
    forecast = model.predict(ds)
    return forecast
  • 創(chuàng)建模型并訓(xùn)練
tf.keras.backend.clear_session()
tf.random.set_seed(51)
np.random.seed(51)

window_size = 30
train_set = windowed_dataset(x_train, window_size, batch_size=128, shuffle_buffer=shuffle_buffer_size)

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv1D(filters=32, kernel_size=5,
                          strides=1, padding="causal", # padding='causal'表示因果卷積碎连,output[t] 不依賴(lài)于 input[t+1:]
                          activation="relu",
                          input_shape=[None, 1]),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32, return_sequences=True)),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32, return_sequences=True)),
    tf.keras.layers.Dense(1),
    tf.keras.layers.Lambda(lambda x: x*200)
])


lr_schedule = tf.keras.callbacks.LearningRateScheduler(
    lambda epoch: 1e-8 * 10**(epoch / 20))
optimizer = tf.keras.optimizers.SGD(lr=1e-8, momentum=0.9)
model.compile(loss=tf.keras.losses.Huber(),
              optimizer=optimizer,
              metrics=["mae"])
history = model.fit(train_set, epochs=100, callbacks=[lr_schedule])
  • 選擇合適的學(xué)習(xí)率
plt.semilogx(history.history["lr"], history.history["loss"])
plt.axis([1e-8, 1e-4, 0, 30])
  • 使用優(yōu)化后的學(xué)習(xí)率重新訓(xùn)練
tf.keras.backend.clear_session()
tf.random.set_seed(51)
np.random.seed(51)
#batch_size = 16
dataset = windowed_dataset(x_train, window_size, batch_size, shuffle_buffer_size)

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv1D(filters=32, kernel_size=3,
                      strides=1, padding="causal",
                      activation="relu",
                      input_shape=[None, 1]),
  tf.keras.layers.LSTM(32, return_sequences=True),
  tf.keras.layers.LSTM(32, return_sequences=True),
  tf.keras.layers.Dense(1),
  tf.keras.layers.Lambda(lambda x: x * 200)
])

optimizer = tf.keras.optimizers.SGD(lr=1e-5, momentum=0.9)
model.compile(loss=tf.keras.losses.Huber(),
              optimizer=optimizer,
              metrics=["mae"])
history = model.fit(dataset,epochs=500)
  • 使用模型預(yù)測(cè)
rnn_forecast = model_forecast(model, series[..., np.newaxis], window_size)
rnn_forecast = rnn_forecast[split_time - window_size:-1, -1, 0]
  • 查看預(yù)測(cè)結(jié)果及指標(biāo)
plt.figure(figsize=(10, 6))
plot_series(time_valid, x_valid)
plot_series(time_valid, rnn_forecast)

tf.keras.metrics.mean_absolute_error(x_valid, rnn_forecast).numpy()
  • 查看訓(xùn)練曲線(xiàn)
import matplotlib.image  as mpimg
import matplotlib.pyplot as plt

#-----------------------------------------------------------
# Retrieve a list of list results on training and test data
# sets for each training epoch
#-----------------------------------------------------------
mae=history.history['mae']
loss=history.history['loss']

epochs=range(len(loss)) # Get number of epochs

#------------------------------------------------
# Plot MAE and Loss
#------------------------------------------------
plt.plot(epochs, mae, 'r')
plt.plot(epochs, loss, 'b')
plt.title('MAE and Loss')
plt.xlabel("Epochs")
plt.ylabel("Accuracy")
plt.legend(["MAE", "Loss"])

plt.figure()

epochs_zoom = epochs[200:]
mae_zoom = mae[200:]
loss_zoom = loss[200:]

#------------------------------------------------
# Plot Zoomed MAE and Loss
#------------------------------------------------
plt.plot(epochs_zoom, mae_zoom, 'r')
plt.plot(epochs_zoom, loss_zoom, 'b')
plt.title('MAE and Loss')
plt.xlabel("Epochs")
plt.ylabel("Accuracy")
plt.legend(["MAE", "Loss"])

plt.figure()

【參考文獻(xiàn)】
1.google colab

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末大溜,一起剝皮案震驚了整個(gè)濱河市琴庵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搜吧,老刑警劉巖偎蘸,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帚称,死亡現(xiàn)場(chǎng)離奇詭異嘹叫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丛肢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)围肥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜂怎,你說(shuō)我怎么就攤上這事穆刻。” “怎么了杠步?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵氢伟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我幽歼,道長(zhǎng)朵锣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任甸私,我火速辦了婚禮诚些,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皇型。我一直安慰自己诬烹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布弃鸦。 她就那樣靜靜地躺著绞吁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寡键。 梳的紋絲不亂的頭發(fā)上掀泳,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音西轩,去河邊找鬼员舵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛藕畔,可吹牛的內(nèi)容都是我干的马僻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼注服,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼韭邓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起溶弟,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤女淑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辜御,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸭你,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年擒权,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袱巨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碳抄,死狀恐怖愉老,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剖效,我是刑警寧澤嫉入,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贱鄙,受9級(jí)特大地震影響劝贸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逗宁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一映九、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞎颗,春花似錦件甥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至倦逐,卻和暖如春譬正,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工曾我, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粉怕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓抒巢,卻偏偏與公主長(zhǎng)得像贫贝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛉谜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 導(dǎo)入所需的包 構(gòu)造人工時(shí)序數(shù)據(jù) 創(chuàng)建模型并訓(xùn)練 選擇合適的學(xué)習(xí)率 使用優(yōu)化后的學(xué)習(xí)率重新訓(xùn)練 使用模型進(jìn)行預(yù)測(cè) 查...
    poteman閱讀 759評(píng)論 0 0
  • 導(dǎo)入所需的包 輔助函數(shù)及構(gòu)造數(shù)據(jù) 定義和訓(xùn)練模型 選擇合適的學(xué)習(xí)率 使用優(yōu)化的學(xué)習(xí)率重新訓(xùn)練稚晚,注意迭代次數(shù)增加了 ...
    poteman閱讀 430評(píng)論 0 0
  • 本內(nèi)容為Udacity課程波士頓房?jī)r(jià)預(yù)測(cè)項(xiàng)目,歡迎閱讀型诚,有錯(cuò)的地方請(qǐng)留言客燕。僅參考不建議作為其他用途。 優(yōu)達(dá)學(xué)城畢業(yè)...
    MrMiaow閱讀 14,362評(píng)論 1 18
  • 機(jī)器學(xué)習(xí)術(shù)語(yǔ)表 本術(shù)語(yǔ)表中列出了一般的機(jī)器學(xué)習(xí)術(shù)語(yǔ)和 TensorFlow 專(zhuān)用術(shù)語(yǔ)的定義狰贯。 A A/B 測(cè)試 (...
    yalesaleng閱讀 1,964評(píng)論 0 11
  • “團(tuán)隊(duì)共識(shí)共創(chuàng)營(yíng)”第三期活動(dòng)感受 今天在剛開(kāi)始活動(dòng)時(shí)幸逆,我自己的狀態(tài)并不好,心里總有其他的雜事暮现,靜不下來(lái)还绘,在林老...
    啤酒烤串兒閱讀 352評(píng)論 0 2