10.22 介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

作者:Nils Ackermann
編譯:ronghuaiyang

導讀

許多文章關注二維卷積神經網絡,主要是用於圖像相關的問題。一維cnn在一定程度上也包括在內了,例如自然語言處理(NLP)。但是,對於你可能面臨的其他機器學習問題,很少有文章提供關於如何構建1D CNN的解釋性的操作。本文試圖彌補這一差距。

介紹

許多文章關注二維卷積神經網絡,主要是用於圖像相關的問題。一維cnn在一定程度上也包括在內了,例如自然語言處理(NLP)。但是,對於你可能面臨的其他機器學習問題,很少有文章提供關於如何構建1D CNN的解釋性的操作。本文試圖彌補這一差距。

什麼時候使用1D CNN?

CNN可以很好地識別數據中的簡單模式,然後將其用於在更高的層中形成更復雜的模式。當你希望從整個數據集中較短(固定長度)的片段中獲得特徵,並且該特徵在片段中的位置相關性不高時,一維CNN非常有效。

這可以很好地應用於分析傳感器數據的時間序列(如陀螺儀或加速度計數據)。它也適用於分析任何類型的信號數據在固定長度的週期(如音頻信號)。另一個應用程序是NLP(儘管這裡LSTM更有前途,因為單詞的接近程度可能並不總是可訓練模式的良好指示器)。

1D CNN和2D CNN之間有什麼差別?

無論是一維、二維還是三維,CNNs都具有相同的特性,並遵循相同的方法。關鍵的區別在於輸入數據的維數,以及特徵檢測器(或過濾器)如何在數據之間滑動:

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

1D versus 2D CNN

問題描述

在這篇文章中,我們將專注於自於智能手機的時間切片的加速度計和傳感器數據。根據x軸、y軸和z軸的加速度計數據,1D CNN可以預測用戶正在進行的活動類型(如“散步”、“慢跑”或“站立”)。對於各種活動,數據的每個時間間隔都類似於此。

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

加速度計數據的時間序列樣本

如何在Python中構建1D CNN?

有許多標準的CNN模型可用。我選擇了Keras網站上描述的一個模型(https://keras.io/getting-started/sequential-model-guide/),並對其進行了輕微修改,以適應上面描述的問題。下圖提供了構建模型的高層概覽。每一層都將作進一步解釋。

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

1D CNN的例子

我們先看看Python代碼:

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

運行此代碼將產生如下深度神經網絡:

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

讓我們深入每一層看看發生了什麼:

  • 輸入數據:數據經過預處理,每個數據記錄包含80個時間片(數據以20赫茲採樣率記錄,因此每個時間間隔包含加速度計讀取的4秒數據)。在每個時間間隔內,存儲x軸、y軸和z軸的三個加速度計值。這就得到了一個80x3矩陣。由於我通常在iOS中使用神經網絡,所以數據必須作為長度為240的平面向量傳遞到神經網絡中。網絡的第一層必須將其重塑為原來的形狀,即80 x 3。
  • 第一個一維CNN層: 一個高度為10(也稱為內核大小)的過濾器(或也稱為特徵檢測器)。只定義一個過濾器將允許神經網絡學習第一層中的一個單一特徵。這可能還不夠,因此我們將定義100個過濾器。這允許我們在網絡的第一層訓練100個不同的特徵。第一個神經網絡層的輸出是一個71 x 100的神經元矩陣。輸出矩陣的每一列包含一個過濾器的權重。根據定義的內核大小和考慮輸入矩陣的長度,每個過濾器將包含71個權重。
  • 第二個一維CNN層:第一個CNN的結果將被輸入第二個CNN層。我們將再次定義100個不同的過濾器在這個級別上進行訓練。按照與第一層相同的邏輯,輸出矩陣的大小將為62 x 100。
  • 最大池化層:通常在CNN層之後使用池化層,以降低輸出的複雜度,防止數據過擬合。在我們的示例中,我們選擇了尺寸為3。這意味著該層的輸出矩陣的大小僅為輸入矩陣的三分之一。
  • 第三和第四個一維CNN層:下面是一維CNN層的另一個序列,以便學習更高層次的特徵。這兩層之後的輸出矩陣是一個2x160矩陣。
  • 平均池化層:多一個池化層,進一步避免過擬合。這次不是取最大值,而是取神經網絡中兩個權值的平均值。輸出矩陣的大小為1 x 160個神經元。每個特徵檢測器在這一層的神經網絡中只剩下一個權值。
  • Dropout層: Dropout層將隨機分配權值0給網絡中的神經元。因為我們選擇了0.5的概率,50%的神經元將獲得0權值。通過這種操作,網絡對數據中較小的變化不那麼敏感。因此,它應該進一步提高我們對不可見數據的準確性。這一層的輸出仍然是1×160個神經元矩陣。
  • 使用Softmax激活的全連接層:最後一層將高度160的向量減少到6,因為我們要預測6個類(“慢跑”、“坐下”、“行走”、“站立”、“上樓”、“下樓”)。這由一個矩陣乘法完成。使用Softmax作為激活函數。它使神經網絡的所有6個輸出加起來等於1。因此,輸出值將表示這六個類中的每個類的概率。

訓練和測試神經網絡

下面是Python代碼,用於訓練批處理大小為400、訓練和驗證大小為80到20的模型。

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

該模型對訓練數據的準確率達到97%。

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

將其與測試數據進行比較,準確率為92%。

Accuracy on test data: 0.92
Loss on test data: 0.39

考慮到我們使用的是一個標準的一維CNN模型,這是一個很好的數字。我們的模型在精確度、召回率和f1分上也得分很高。

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

下面簡要回顧一下這些分數的含義:

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

預測 vs 結果 的矩陣

與測試數據相關聯的混淆矩陣如下所示。

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析

總結

在本文中,你可以看到如何使用1D CNN訓練網絡,演示了一個根據智能手機上的一組加速度計數據預測用戶行為的示例。完整的Python代碼可以在github:https://github.com/ni79ls/har-keras-cnn上找到。

英文原文:https://blog.goodaudience.com/introduction-to-1d-convolutional-neural-networks-in-keras-for-time-sequences-3a7ff801a2cf

介紹一下如何用一維卷積來做序列模型,基於Keras的詳細代碼解析


分享到:


相關文章: