[深度應用]·使用一維卷積神經網絡處理時間序列數據

概述

許多技術文章a都關注於二維卷積神經網絡(2D CNN)的使用,特別是在圖像識別中的應用。而一維卷積神經網絡(1D CNNs)只在必定程度上有所涉及,好比在天然語言處理(NLP)中的應用。目前不多有文章可以提供關於如何構造一維卷積神經網絡來解決你可能正面臨的一些機器學習問題。本文試圖補上這樣一個短板。html

 

 

 

 

 

什麼時候應用 1D CNN?

CNN 能夠很好地識別出數據中的簡單模式,而後使用這些簡單模式在更高級的層中生成更復雜的模式。當你但願從總體數據集中較短的(固定長度)片斷中得到感興趣特徵,而且該特性在該數據片斷中的位置不具備高度相關性時,1D CNN 是很是有效的。git

1D CNN 能夠很好地應用於傳感器數據的時間序列分析(好比陀螺儀或加速度計數據);一樣也能夠很好地用於分析具備固定長度週期的信號數據(好比音頻信號)。此外,它還能應用於天然語言處理的任務(因爲單詞的接近性可能並不老是一個可訓練模式的好指標,所以 LSTM 網絡在 NLP 中的應用更有前途)。github

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

不管是一維、二維仍是三維,卷積神經網絡(CNNs)都具備相同的特色和相同的處理方法。關鍵區別在於輸入數據的維數以及特徵檢測器(或濾波器)如何在數據之間滑動:web

 

 

 

 

 

「一維和二維卷積神經網絡」 由 Nils Ackermann 在知識共享許可 CC BY-ND 4.0 下受權。網絡

問題描述

在本文中,咱們將專一於基於時間片的加速度傳感器數據的處理,這些數據來自於用戶的腰帶式智能手機設備。基於 x、y 和 z 軸的加速度計數據,1D CNN 用來預測用戶正在進行的活動類型(好比「步行」、「慢跑」或「站立」)。你能夠在個人另外兩篇文章中找到更多的信息 這裏 和 這裏。對於各類活動,在每一個時間間隔上的數據看起來都與此相似。app

 

來自加速度計數據的時間序列樣例機器學習

如何在 PYTHON 中構造一個 1D CNN?

目前已經有許多得標準 CNN 模型可用。我選擇了 Keras 網站 上描述的一個模型,並對它進行了微調,以適應前面描述的問題。下面的圖片對構建的模型進行一個高級概述。其中每一層都將會進一步加以解釋。ide

 

「一維卷積神經網絡示例」由 Nils Ackermann 在知識共享許可 CC BY-ND 4.0 下受權。函數

讓咱們先來看一下對應的 Python 代碼,以便構建這個模型:學習

model_m = Sequential()
model_m.add(Reshape((TIME_PERIODS, num_sensors), input_shape=(input_shape,)))
model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
model_m.add(Conv1D(100, 10, activation='relu'))
model_m.add(MaxPooling1D(3))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(GlobalAveragePooling1D())
model_m.add(Dropout(0.5))
model_m.add(Dense(num_classes, activation='softmax'))
print(model_m.summary())

運行這段代碼將獲得以下的深層神經網絡:


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
reshape_45 (Reshape)         (None, 80, 3)             0         
_________________________________________________________________
conv1d_145 (Conv1D)          (None, 71, 100)           3100      
_________________________________________________________________
conv1d_146 (Conv1D)          (None, 62, 100)           100100    
_________________________________________________________________
max_pooling1d_39 (MaxPooling (None, 20, 100)           0         
_________________________________________________________________
conv1d_147 (Conv1D)          (None, 11, 160)           160160    
_________________________________________________________________
conv1d_148 (Conv1D)          (None, 2, 160)            256160    
_________________________________________________________________
global_average_pooling1d_29  (None, 160)               0         
_________________________________________________________________
dropout_29 (Dropout)         (None, 160)               0         
_________________________________________________________________
dense_29 (Dense)             (None, 6)                 966       
=================================================================
Total params: 520,486
Trainable params: 520,486
Non-trainable params: 0
_________________________________________________________________
None

讓咱們深刻到每一層中,看看到底發生了什麼:

  • 輸入數據: 數據通過預處理後,每條數據記錄中包含有 80 個時間片(數據是以 20Hz 的採樣頻率進行記錄的,所以每一個時間間隔中就包含有 4 秒的加速度計數據)。在每一個時間間隔內,存儲加速度計的 x 軸、 y 軸和 z 軸的三個數據。這樣就獲得了一個 80 x 3 的矩陣。因爲我一般是在 iOS 系統中使用神經網絡的,因此數據必須平展成長度爲 240 的向量後傳入神經網絡中。網絡的第一層必須再將其變形爲原始的 80 x 3 的形狀。

  • 第一個 1D CNN 層: 第一層定義了高度爲 10(也稱爲卷積核大小)的濾波器(也稱爲特徵檢測器)。只有定義了一個濾波器,神經網絡纔可以在第一層中學習到一個單一的特徵。這可能還不夠,所以咱們會定義 100 個濾波器。這樣咱們就在網絡的第一層中訓練獲得 100 個不一樣的特性。第一個神經網絡層的輸出是一個 71 x 100 的矩陣。輸出矩陣的每一列都包含一個濾波器的權值。在定義內核大小並考慮輸入矩陣長度的狀況下,每一個過濾器將包含 71 個權重值。

  • 第二個 1D CNN 層: 第一個 CNN 的輸出結果將被輸入到第二個 CNN 層中。咱們將在這個網絡層上再次定義 100 個不一樣的濾波器進行訓練。按照與第一層相同的邏輯,輸出矩陣的大小爲 62 x 100。

  • 最大值池化層: 爲了減小輸出的複雜度和防止數據的過擬合,在 CNN 層以後常常會使用池化層。在咱們的示例中,咱們選擇了大小爲 3 的池化層。這意味着這個層的輸出矩陣的大小隻有輸入矩陣的三分之一。

  • 第三和第四個 1D CNN 層: 爲了學習更高層次的特徵,這裏又使用了另外兩個 1D CNN 層。這兩層以後的輸出矩陣是一個 2 x 160 的矩陣。

  • 平均值池化層: 多添加一個池化層,以進一步避免過擬合的發生。此次的池化不是取最大值,而是取神經網絡中兩個權重的平均值。輸出矩陣的大小爲 1 x 160 。每一個特徵檢測器在神經網絡的這一層中只剩下一個權重。

  • Dropout 層: Dropout 層會隨機地爲網絡中的神經元賦值零權重。因爲咱們選擇了 0.5 的比率,則 50% 的神經元將會是零權重的。經過這種操做,網絡對數據的微小變化的響應就不那麼敏感了。所以,它可以進一步提升對不可見數據處理的準確性。這個層的輸出仍然是一個 1 x 160 的矩陣。

  • 使用 Softmax 激活的全鏈接層: 最後一層將會把長度爲 160 的向量降爲長度爲 6 的向量,由於咱們有 6 個類別要進行預測(即 「慢跑」、「坐下」、「走路」、「站立」、「上樓」、「下樓」)。這裏的維度降低是經過另外一個矩陣乘法來完成的。Softmax 被用做激活函數。它強制神經網絡的全部六個輸出值的加和爲一。所以,輸出值將表示這六個類別中的每一個類別出現的機率。

訓練和測試該神經網絡

下面是一段用以訓練模型的 Python 代碼,批大小爲 400,其中訓練集和驗證集的分割比例是 80 比 20。

callbacks_list = [
    keras.callbacks.ModelCheckpoint(
        filepath='best_model.{epoch:02d}-{val_loss:.2f}.h5',
        monitor='val_loss', save_best_only=True),
    keras.callbacks.EarlyStopping(monitor='acc', patience=1)
]

model_m.compile(loss='categorical_crossentropy',
                optimizer='adam', metrics=['accuracy'])

BATCH_SIZE = 400
EPOCHS = 50

history = model_m.fit(x_train,
                      y_train,
                      batch_size=BATCH_SIZE,
                      epochs=EPOCHS,
                      callbacks=callbacks_list,
                      validation_split=0.2,
                      verbose=1)

該模型在訓練數據上的準確率可達 97%。


...
Epoch 9/50
16694/16694 [==============================] - 16s 973us/step - loss: 0.0975 - acc: 0.9683 - val_loss: 0.7468 - val_acc: 0.8031
Epoch 10/50
16694/16694 [==============================] - 17s 989us/step - loss: 0.0917 - acc: 0.9715 - val_loss: 0.7215 - val_acc: 0.8064
Epoch 11/50
16694/16694 [==============================] - 17s 1ms/step - loss: 0.0877 - acc: 0.9716 - val_loss: 0.7233 - val_acc: 0.8040
Epoch 12/50
16694/16694 [==============================] - 17s 1ms/step - loss: 0.0659 - acc: 0.9802 - val_loss: 0.7064 - val_acc: 0.8347
Epoch 13/50
16694/16694 [==============================] - 17s 1ms/step - loss: 0.0626 - acc: 0.9799 - val_loss: 0.7219 - val_acc: 0.8107

根據測試集數據進行測試,其準確率爲 92%。

Accuracy on test data: 0.92

Loss on test data: 0.39

考慮到咱們使用的是標準的 1D CNN 模型,獲得這樣的結果已經很好了。咱們的模型在精度(precision)、召回率(recall)和 f1 值(f1-score)上的得分也很高。

              precision    recall  f1-score   support

0                 0.76      0.78      0.77       650
1                 0.98      0.96      0.97      1990
2                 0.91      0.94      0.92       452
3                 0.99      0.84      0.91       370
4                 0.82      0.77      0.79       725
5                 0.93      0.98      0.95      2397

avg / total       0.92      0.92      0.92      6584

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

 

 

 

 

 

「預測和結果矩陣」由 Nils Ackermann 在知識共享 CC BY-ND 4.0 許可下受權。

  • 精確度(Accuracy): 正確預測的結果與全部預測的結果總和之比。即 ((TP + TN) / (TP + TN + FP + FN))

  • 精度(Precision): 當模型預測爲正樣本時,它是對的嗎?全部的正確預測的正樣本除以全部的正樣本預測。即 (TP / (TP + FP))

  • 召回率(Recall): 爲模型識別出的全部正樣本中有多少是正確預測的正樣本?正確預測的正樣本除以全部的正樣本預測。即 (TP / (TP + FN))

  • F1值(F1-score): 是精度和召回率的加權平均值。即 (2 x recall x precision / (recall + precision))

測試數據上對應的混淆矩陣以下所示。

 

 

 

 

 

總結

本文經過以智能手機的加速度計數據來預測用戶的行爲爲例,紹瞭如何使用 1D CNN 來訓練網絡。完整的 Python 代碼能夠在 github 上找到。

連接與引用

  • Keras 文檔 關於一維卷積神經網絡部分

  • Keras 用例 關於一維卷積神經網絡部分

  • 一篇關於使用一維卷積神經網絡進行天然語言處理的好 文章

相關文章
相關標籤/搜索