你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
作者 | Dan 羅傑瑞 |
難度 | 中等 |
所需時間 | 2小時 |
由於我們已經討論過如何使用像是Raspberry Pi之類的嵌入式系統來收集感測器資料,因此我們想介紹一種如何使用資料通過深度學習進行預測的方法。尤其是如果我們的資料庫或存儲庫中已經有大量資料的話,這是一個非常有用的主題。
在執行此專案時,我們使用了以下規格:
- 作業系統: Windows 10
- GPU: Nvidia GTX1070
- RAM: 32GB
這些規格對於這個應用已經綽綽有餘。但是,我們建議使用帶有GPU的電腦來運行此專案,以便您可以立即看到結果。否則,訓練模型的等待時間可能會花費一些時間。另一方面,這是該項目所需的函式庫:
- keras 2.2.4
- matplotlib 2.1.1
- numpy 1.17.4
- opencv-python 3.4.3.18
- tensorflow-gpu 1.11.0
- scikit-image 0.15.0
- scikit-learn 0.19.1
- scipy 1.1.0
如同我們以往的建議,在完成專案教學之前,請先安裝函式庫。也請注意這些函式庫可能不是最新版本,因此這個程式可能不適用於較早或較晚版本的函式庫。
原理
我們要在此專案中使用的神經網路架構基於長短期記憶模型(LSTM)。它是一種人工循環神經網路,主要用於時間序列資料的預測。 LSTM包含一個由輸入、輸出和遺忘閥組成的單元。典型的LSTM單元如下所示:
資料來源:https://bhrnjica.net/2019/04/08/in-depth-lstm-implementation-using-cntk-on-net-platform/
作為簡要說明,LSTM單元的輸入是資料x的時間序列集,它經歷了多個sigmoid activation閥,每個閥計算一個確定的函數以計算單元狀態。我們提供的只是LSTM工作原理非常簡要的解釋,有關LSTM的更多資訊,最好參加一門深度學習課程以進一步理解這些概念。
軟體
在學習了有關LSTM的一些知識之後,我們想瞭解如何將LSTM實施到程式中。要閱讀本教學,請參考我們Github中的LSTM_demo.py。
https://github.com/danrustia11/WeatherLSTM
打開演示程式後,您可以看到以下原始程式碼:
1)首先,我們要調用運行該程式所需的函式庫。除此之外,我們想調用一些資料條件函數。與其他LSTM演示相比,我們想在這裡展示使用整理過的輸入資料執行LSTM預測的重要性。正如人們所期望的那樣,LSTM並不是預測的完美解決方案。如果從資料中發現的模式很少,那麼LSTM仍然無法預測您的資料。因此,我們要先對資料進行條件處理。除此之外,我們希望通過設置亂數產生器來使結果可再現。
2)接下來,我們只想使用該程式所需的其他函式庫。特別是我們希望正規化資料以進行訓練。正規化對於提高模型效率非常重要。
3)在這裡,您可以設置n_timestamp,即要用作預測輸入的時間戳記數(在本例中為天數)。因為我們要在進行預測之前考慮模型應檢查多少資料所以這很重要。這取決於要應用在哪個方面,假設我們要進行天氣預報,那麼我們可能至少需要一週的資料才能預測第二天的資料。
我們這裡也有訓練天數train_days,這樣可以確保模型根據歷史資料學習幾種模式, testing_days是我們要預測的天數。對於訓練,我們有n_epochs,即訓練所需的回合數。由於我們能夠事先測試該程式,因此大約25個epoch就足以訓練模型而不會過度擬合。
最後,我們有filter_on變數,用於啟動資料過濾器。
4)我們要在這裡選擇模型類型,我們要使用兩個LSTM細胞堆疊在一起的堆疊模型。
5)我們的資料來自下方網址,我們將使用臺灣環境保護局提供的臺灣宜蘭縣的每日環境溫度。
6)這邊我們對資料集執行中值過濾和高斯過濾。
7)接下來,我們要根據之前設置的變數設置訓練和測試資料集。
8)此處將資料標準化,範圍是0到1。
9)我們的資料是根據之前宣告的分割時間戳記數。
這意味著我們使用n_timestamps來預測第二天。預測程式執行n_timestamps的移動視窗(moving window)以進行預測
10)現在我們要使用Keras建構LSTM模型。
11)我們從這裡開始模型訓練。如果您無法執行訓練程式,那麼減少batch size可能是一個不錯的解決方案。
12)之後我們希望基於測試資料集來預測資料,我們還希望根據正規化過程將資料轉換回其原始值。
13)最後我們要顯示預測結果,包括原始資料、n個預測天數和前75天。
使用這些程式碼顯示訓練曲線、殘差圖和散點圖,作為結果的參考我們還將MSE和r2包括在內。
結果
如果您使用我們的預設參數,可以看到以下結果:
圖1.堆疊式LSTM預測結果,使用10個輸入天的篩檢程式。
從結果可以看出,我們的模型預測是成功的,但是從預測的天數(n天)可以看出,錯誤通常是由於資料的意外上升或下降(例如在350-360天),不過在前75天模型可以正確的遵循資料模式。
但是為了嘗試調整LSTM模型,我們也使用不同的參數執行程式:
從表中可以看出,與其他類型相比,堆疊式LSTM的性能最佳,還可以看到單細胞在輸入100天後效果很好,但是我們發現這種設置在計算上消耗過大,雙向LSTM在輸入天數較多的情況下也表現較差。
最後,我們想證明調節資料對執行LSTM來說確實很重要,常理來講預測的準確率並不會達到99.9%,而且我們在這個專案中只是想預測溫度,而不是像火山爆發這類的事件。為了證明我們的觀點,以下是未經過濾的結果:
圖2. 堆疊式LSTM預測結果,沒有使用10個輸入天的過濾器。
我們可以看到,如果沒有使用過濾器,則LSTM模型只能遵循該模式,但誤差幅度更大。結果仍然是會產生的,有點合理但是不是太精確。以下是對結果進行定量比較的表格:
總結
在這個專案中,我們發現LSTM是預測資料的好工具,但是從這裡我們可以看到使用LSTM可以學到一些經驗。首先,輸入更多的天數並不真正意味著該模型將更加準確,除此之外,資料調節可能有助於使模型更準確,最後,即使我們沒有展示,LSTM也需要一定數量的資料才能實際應用。從這些經驗中,我們可以想像LSTM實際應用在預測股票、天氣、趨勢等方面。
Github:
https://github.com/danrustia11/WeatherLSTM
參考資料:
https://colah.github.io/posts/2015-08-Understanding-LSTMs/
https://www.kdnuggets.com/2018/11/keras-long-short-term-memory-lstm-model-predict-stock-prices.html
https://bhrnjica.net/2019/04/08/in-depth-lstm-implementation-using-cntk-on-net-platform/