選自TowardsDataScience,做者:Norman Di Palo,機器之心編譯。php
腦電圖是一種利用電極記錄大腦活動的非侵入式技術,但大腦活動和腦電圖信號之間的關係很是複雜,如何「解碼」成爲困擾研究者的一大難題。本文做者利用 Kaggle 競賽中的腦電圖數據探索與特定手勢對應的腦電圖模式,並以此設計神經網絡。
神經系統是一個極其複雜的結構。人體內有超過十萬千米的神經與脊髓和大腦相連。這種「網格」傳輸控制每個運動的電脈衝。每個指令都從大腦發出,大腦是一個更加神奇的神經元結構,經過電激活信號進行通訊。理解和解釋大腦的電模式是神經科學家和神經生物學家的研究熱點之一,但事實證實這是一項極具挑戰性的任務。git
記錄大腦活動的一種非侵入式技術是「腦電圖」(EEG),使用固定在患者頭皮上的電極記錄腦電壓波動。一般在頭皮周圍固定大約 30 個電極,記錄腦電波的整體活動。不管如何,大腦活動和 EEG 信號之間的關係很是複雜,若是不借助具體的實驗測試,咱們將很難理解。所以,一個巨大的挑戰是學習如何「解碼」,在某種意義上,這些腦電圖掃描能夠容許使用非侵入式腦機接口(BCI)來控制機器假肢和其餘設備。github
利用 EEG 記錄腦電波。CC BY-SA 2.0,來源:commons.wikimedia.org/w/index.php…bash
做爲強數據驅動的學科,最近在相關模式識別任務中取得的「深度學習」新突破爲使用「神經網絡」分析這些電信號創造了一種新方法。在這篇文章中,咱們首先介紹這一主題:閱讀 Kaggle 競賽(Grasp-and-Lift EEG Detection)提供的 EEG 數據,該競賽旨在檢測哪些 EEG 模式對應特定的手臂和手勢動做,如抓取或提起物體。在以不一樣的方式預處理數據以後,咱們將設計一個神經網絡來執行這種分類。此外,我還將展現一些大腦活動的數據可視化,以便大體瞭解正在使用的數據。這一研究領域的最終目標是開發平價、實用的假肢裝置,經過大腦控制假肢,幫助截肢者恢復輕鬆進行基本活動的能力。相似的技術也能夠應用於讀取肌肉電激活,從而經過分析激活的肌肉來解碼人試圖執行的運動類型。網絡
數據簡介架構
若是你擁有 Kaggle 賬戶,那麼你能夠在該網址免費下載數據:www.kaggle.com/c/grasp-and…。數據由幾個.csv 文件組成。這些文件分別是:ionic
經過記錄不一樣人體測試者在執行簡單動做(例如抓取和提高物體)時的腦電圖來收集數據。所以,咱們按不一樣的場景、主題對數據集進行分類。咱們將在稍後的準確率預測中看到,腦電波可能很是個性化,由於模型能夠很是準確地預測同一我的在沒見過的場景中的意圖,但若是訓練不夠多樣,那麼與新的測試人員進行一樣的訓練會很困難。性能
所以,目標是建立一個神經網絡,該網絡將腦電圖數據做爲輸入,並輸出測試者試圖實現的 6 個可能動做的機率分佈。因爲「no action」不屬於 6 個類別,所以咱們能夠將其添加爲類,或者將全部可能的輸出設置爲 0 到 1 之間的值,並使用閾值來肯定是否檢測到動做。若是每個動做都低於閾值,則咱們就認爲沒有動做。學習
電極位置,來源:www.kaggle.com/c/grasp-and…測試
我製做了這些電極活動的動畫數據可視化。因爲採樣頻率至關高(500 Hz),所以我使用了簡單的 3 步低通濾波器來平滑數據,並使用前 100 幀(約 1/5 秒)建立動畫。
咱們還能夠將時序數據可視化爲 2D 熱圖,其中縱軸表明時間(從上到下遞增),橫軸表示 32 個電極。
這也很是有用,由於正如咱們將看到的,它容許咱們使用「時空卷積」。
數據預處理
爲方便學習階段,咱們應對原始數據進行預處理。例如,與執行動做的較低變化率相比,很是高的 EEG 採樣頻率會引起許多問題:數據變化很是快,可是動做實際上保持不變,所以波動幾乎能夠被認爲是噪聲。此外,時序模型接收大量快速變化的數據,而分類輸出從不改變。
第一個可能的步驟是「使用低通濾波器過濾數據」。即便是簡單的運行平均值也能起做用:經過這種方式,咱們緩解了數據的高頻變化,同時保留了更有用的低頻結構,由於咱們即將分類的動做具備很是低的變化頻率(最多 1Hz)。以後,咱們能夠對數據進行二次採樣,即每 10100 個數據點只保留一個數據點。從某種意義上說,這也有助於下降時間維度及數據的相關性,從而使數據更加時間稀疏。
也能夠採用其餘預處理技術,可是爲了簡潔起見,咱們就此打住,開始設計神經網絡。
神經網絡設計與實驗
處理時序數據時,咱們首先想到的架構之一是「循環神經網絡」。這些網絡具有動態結構,其內部狀態容許它們對時序數據進行編碼,所以這些網絡還基於過去的輸入計算輸出。我在 Keras 中設計了一個 LSTM 網絡,併爲其提供了具有連續時序結構的訓練數據。結果很好,但在這個特定的例子中,我更感興趣的是展現一個一般用於圖像的卷積神經網絡如何很好地應用到時序數據上。
如前所述,從某種意義上來講,咱們其實是在處理時空數據:以上熱圖的縱軸表示時間演化,而橫軸表示各類電極,結果相近的電極在人類頭皮上的空間位置每每也很接近。這意味着咱們能夠用卷積提取有用特徵:2D 卷積核將同時在時間和空間上編碼模式。設想一個 3*3 卷積核:它可以在熱圖中的矩陣上,經過在 3 個不一樣時間步(3 個核行)以及在 3 個不一樣的電極(3 個核列)上進行加權求和,來提取特徵。所以,具備許多核的 CNN 能夠發現電極的激活在與想要的動做相關的有限時間週期上的變化特徵」。
我在 Keras 中實現了一個簡單的 CNN,來檢查它在這個數據集上的性能。
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM, CuDNNLSTM, BatchNormalization, Conv2D, Flatten, MaxPooling2D, Dropout
from keras.optimizers import Adam
model = Sequential()
#model.add(CuDNNLSTM(128, input_shape = (time_steps//subsample, 32)))
model.add(Conv2D(filters = 64, kernel_size = (7,7), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Conv2D(filters = 64, kernel_size = (5,5), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Flatten())
#model.add(Dropout(0.2))
model.add(Dense(32, activation = "relu"))
model.add(BatchNormalization())
# model.add(Dropout(0.2))
model.add(Dense(6, activation = "sigmoid"))
adam = Adam(lr = 0.001)
model.compile(optimizer = adam, loss = "categorical_crossentropy", metrics = ["accuracy"])
model.summary()
複製代碼
爲了檢查模型的性能,如 Kaggle 競賽中所建議的,咱們能夠查看 AUC 分數。若是不熟悉 AUC,建議讀一下這個清晰直觀的解釋(datascience.stackexchange.com/questions/8…)。從代碼所在 notebook 中能夠看到,咱們能夠在快速訓練階段達到約 0.85 的 AUC 分數。
結論
在這篇文章中,咱們介紹了腦電信號與腦電圖,後者是一種利用用戶頭皮上的電極記錄有用信號的非侵入式且相對簡單的方法。咱們看到了一些直觀的數據可視化,以及如何使用神經網絡從這些數據中提取運動意向等特徵。我相信這一領域(機器假肢、腦機接口)將會由於深度學習而獲得深刻發展。
這些技術的影響將是巨大的。擁有可以以天然方式控制的低成本假肢能夠極大地改善數百萬人的生活。
建議查看近期啓動的 Symbionic Project 項目,參與項目的天才們嘗試創造一種低成本的智能手臂假肢,該假肢能夠利用肌肉激活控制,目的是實現這種裝置的平民化。