作者 | Ren Jie Tan
來源 | Towards Data Science
編輯 | 代碼醫生團隊
在這篇文章中,與大家分享一下作為數據科學家時所學到的一些技巧和竅門以及如何使用它們來快速增強模型。還將看到在德克薩斯大學達拉斯多模式人類行動數據集(UTD-MHAD)上進行人類活動分類的集合方法。該集合的驗證準確度為0.821,這是基線論文準確度為0.672的顯著改進。
https://www.utdallas.edu/~kehtar/UTD-MHAD.html
背景(問題)
任務是在UTD-MHAD上應用數據融合來構建一個模型來對27種不同的人類行為進行分類,就像所有拖延者一樣,把它留到了上周才開始這樣做。*最大壓力=最高生產力!*
UTD-MHAD是從Kinect相機和一個可穿戴慣性傳感器收集的開放數據集。該數據集包含由8名測試者執行的27個動作,每個測試者重複每次動作4次。在移除3個損壞的序列後,數據集留下861個數據序列。數據集包含4種數據模式,即:
RGB視頻
深度視頻
骨架關節位置
慣性傳感器信號
所有4種模態都是時間同步的,分別以.avi和.mat格式存儲。
任務:打敗0.672的基線準確度
該數據集附帶了一篇論文,該論文使用了協同表示分類器(CRC),其驗證準確度為0.672。這是根據列車驗證分組計算的,其中受試者1,3,5,7用於訓練,受試者2,4,6,8用於驗證,這也是必須擊敗的基線準確度!
所有人都興奮起來,立即上網開始尋找過去的代碼和教程。在網上花了大約30分鐘後,很快意識到沒有可重複使用的代碼!*壓力等級增加*。然後突然意識到必須從頭開始做這一切。趕緊拿出筆和筆記本,開始設計策略。
6個步驟概述
了解數據
快速原型
性能指標
自動化可以使用的部件,並將訓練發送給Google Colab
與同事討論獲取靈感
合併模型
第1步:了解數據
在開始任何事情之前,了解正在處理的內容非常重要。在這種情況下,最好的方法是繪製它!使用NumPy,SciPy和Matplotlib庫來有效地實現這些目標。以下是進行網球揮桿的對象的深度,骨架和慣性數據的圖。有關詳細信息,請參考GitHub庫。
https://github.com/notha99y/Multimodal_human_actions
網球揮桿的視頻截圖
網球揮桿的深度視頻
網球揮桿的骨架關節位置
網球揮桿的慣性傳感器信號
所以現在已經繪製了它們,必須將它們轉換為合適的格式來為模型提供信息。選擇是NumPy數組。對於這篇文章,將主要關注僅使用Skeleton和Inertial Data。對於RGB和深度視頻,需要特別注意創建VideoDataGenerator以從磁碟讀取它們,因為它們太大而無法加載到內存中。
骨架和慣性數據具有不同的周期,對於慣性傳感器,具有不同的幅度。直方圖繪製是顯示這些分布的有效方式。
期間分布
慣性傳感器數據的周期分布
這不應該是一個驚喜,因為這些是由不同主題執行的各種動作。該實驗也未指定應如何執行特定操作,因此猜測主題將根據自己的經驗執行操作。
由於模型需要固定的輸入形狀,所以這些不同的周期根本不會飛。有兩種策略可以解決這個問題:
將信號零填充到最大長度326
將信號重新採樣到平均180周期
幅度分布
3軸陀螺儀數據的幅度分布(上邊為最小值,下邊為最大值)
3軸加速度計數據的幅度分布(上邊的最小值,下邊的最大值)
振幅的分布類似於長尾。由于振幅不會影響輸入數據的形狀,因此可以選擇不對其應用任何預處理技術。否則諸如均值 - 方差歸一化的歸一化技術可以應用於預處理。
第2步:快速原型
正如精益創業方法所宣揚的那樣,「快速失敗,廉價失敗」。下一步是構建一個輕量級模型,允許快速迭代。Keras是用Python編寫的高級神經網絡包裝器,它將成為此任務的首選框架。Keras允許您使用乾淨,極簡主義的方法,只需幾行代碼即可構建龐大的深度學習模型。可以看到它在repo中的代碼實現中是多麼容易。也將它與Tensorflow後端一起使用。
首先只使用慣性數據。由於數據是6個通道的序列(加速度計的3軸+陀螺儀的3軸),要構建的第一個模型是Simple LSTM ,其中LSTM單元為512個隱藏單位。
def simple_LSTM():
np.random.seed(7)
model = Sequential(name = 'simple_LSTM')
model.add(LSTM(512, input_shape=(None, 6), recurrent_dropout=0.5))
model.add(Dense(len(activities), activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=1e-4), metrics=['accuracy'])
print(model.summary())
return model
Minimalist Keras Code實現Simple LSTM模型
簡單LSTM模型的網絡圖
第3步:性能指標
創建模型後,現在需要一個可靠的反饋系統來告知模型的執行情況。由於這是一個具有良好平衡的類別分布的分類任務,因此精度足以作為唯一的性能指標,而無需計算精度,召回或F1分數。
為了查看模型是否過度擬合,還可以獲得Train-Validation Accuracy-Loss圖。還可以繪製27級混淆矩陣,以查看哪些操作通常被錯誤分類為另一種。
簡單LSTM的訓練(藍色)和驗證(綠色)組的丟失(上)精度(下)圖
從準確度 - 損失圖中,可以看到模型在很早的時期過度擬合,驗證精度在第4時期後達到穩定水平。在第15期,得到了一個驗證精度為~0.238的模型,這與必須擊敗的基準0.672相差甚遠。
必須改變策略或應用更多正規化技術,例如Dropout圖層。
慣性數據上Simple LSTM模型的混淆矩陣
這個混亂矩陣看起來像一個掃雷遊戲的截圖!唯一的優點是「站立坐姿」和「坐姿站立」動作,模型分別預測16(完美分數)和13分。其他25項行動的表現非常糟糕。
在強調自己的壓力之前,退一步看看到目前為止我們做了什麼。
數據科學管道
剛剛從上面的流程圖中完成了從步驟1 - > 4開始的一次完整迭代,得到的第一個驗證精度為0.238。這不是理想的,但這是一個非常好的第一次開始。已經建立了一個高度迭代的數據科學管道,可以高效地探索,構建和評估項目。都同意數據科學是一個高度迭代的旅程。
有了這個基礎,現在可以創造性地嘗試不同的東西來改進模型。接下來的部分中,將向您展示使用這個迭代管道找到的所有關鍵結果。
預處理
通過這個管道,還發現與零填充相比,將序列重新採樣到180的平均值可以獲得更好的收斂。振幅歸一化導致模型性能沒有明顯改善,因此將跳過它以防止不必要的計算。
第4步:自動化可以使用的部件,訓練發送給Google Colab
由於很可能經常重複某些步驟,因此花一些時間並自動化它們是值得的。可以將某些經常使用的代碼轉換為腳本並對它們執行功能抽象。
Keras Callbacks
對於那些試圖深入學習的人來說,Keras的回調是最好的事情之一。它們是自動化模型訓練的工具,分享最喜歡的3個回調,這對各種項目非常有幫助。
首先是TensorBoard。這允許Keras保存一個事件日誌文件,該文件在培訓期間不斷更新,並且可以由TensorBoard讀取和查看。這允許您的模型訓練的實時,圖形可視化,我強烈推薦它作為替代,然後只從Keras的model.fit()輸出中查看它。
第二,ModelCheckpoint。這允許Keras模型將權重保存到給定的文件目錄。有一些有用的參數,例如`monitor`,save_best_only可以讓控制Keras如何保存重量。
最後但並非最不重要的是,EarlyStopping回調。這樣可以讓Keras根據指定的條件停止訓練。如下所示,設置 min_delta=0 和 patience=5。這意味著如果Keras發現模型的驗證準確度在5個時期之後沒有增加,那麼Keras將停止訓練。
通過這3個回調設置,可以安全地離開模型訓練。
from keras.callbacks import EarlyStopping
from keras.callbacks import TensorBoard
from keras.callbacks import ModelCheckpoint
LOG_DIR = os.path.join(os.getcwd(), 'logs')
tb = TensorBoard(LOG_DIR)
weights_dir = 'weights/' + model.name + \
'-{epoch:02d}-{loss:.2f}.hdf5'
chkpt = ModelCheckpoint(filepath=weights_dir, monitor='loss', save_best_only=True, save_weights_only=True, mode='auto', period=1)
early_stop = EarlyStopping(monitor='val_acc', min_delta=0, patience=5)
history = model.fit(X_train, Y_train, epochs=50, batch_size=3, validation_data = (X_test, Y_test), callbacks=[tb, chkpt, early_stop])
有用的Keras回調
Google Colaboratory
眾所周知,訓練深度學習模型是一個非常耗費GPU的過程。幸運的是 Google Colaboratory免費提供了強大的TPU內核!對於那些買不起強大GPU的人,可以考慮將訓練運送到Google Colab。Google Colab還提供了一個熟悉的Jupyter筆記本式界面,使用起來非常直觀。它也安裝在 Google雲端硬碟上,因此可以輕鬆地將數據讀入Colab。重量和日誌也可以輕鬆保存。
https://colab.research.google.com/
第5步:與同事討論以獲得靈感
通過第2-4節中的快速原型製作和評估的半自動化管道,現在是時候獲得靈感並找到創新方法來提高模型的驗證準確性。Google不同的搜索字詞,或者訪問Google Scholar,Science Direct和Pubmed等門戶網站可以提供見解。與同事聊聊你的問題可能會給偶然的「尤裡卡」時刻。
正在與一位正在從事自然語言處理(NLP)項目的同事聊天,該項目給了嘗試雙向LSTM(BLSTM)的靈感(。BLSTM反轉原始隱藏層並連接它們,允許一種生成性深度學習形式,從而使輸出層同時獲得過去和未來狀態的信息。只需添加一層BLSTM,驗證精度就會增加到0.465。
雙向LSTM模型網絡圖
Conv LSTM模型的網絡圖
Conv LSTM模型
當添加Convolutional圖層進行特徵提取時,取得了重大突破。由於輸入數據是一維信號,該模型使用一系列一維卷積和一維最大池層來提取更高維度的潛在特徵,然後將它們輸入到捕獲時間信息的2個LSTM單元中。然後平坦化LSTM單元的輸出,並且在添加具有softmax激活的Dense層之前附加具有0.5的丟失率的Dropout層以對所有27個動作進行分類。
這使驗證精度達到0.700,僅僅是慣性數據,這是第一次超過0的CRC模型基線。對於所有的模型,使用AdamOptimizer,學習率為1e-4,β1為0.9,β2為0.999。使用Xavier Glorot初始化器初始化可訓練參數,並將批量大小設置為3以允許模型更好地推廣。
UNet LSTM模型
聯合國是一個完全卷積神經網絡(FCNN),在收縮和擴展路徑中幾乎是對稱的。在收縮路徑中,輸入通過一系列卷積和最大池化來饋送,增加了特徵圖並降低了圖像的解析度。這增加了「什麼」並減少了「哪裡」。在擴展路徑中,具有低解析度的高維特徵通過卷積核進行上採樣。在此操作期間,功能圖減少了。UNet的一個新特點是它在收縮路徑中實現了與擴展層的低維特徵圖的高維特徵的串聯。類似地將卷積網絡中提取的特徵添加到2個LSTM單元中,將輸出展平並附加Dropout層,其丟失率為0。5使用帶有softmax激活的Dense圖層完成所有27個操作的分類。在下面的附錄中附上了網絡圖。
UNet LSTM模型在慣性數據上的驗證準確度為0.712。
第6步:合併模型
由於Conv LSTM和UNet LSTM在驗證數據上表現相當不錯,可以通過取平均值來合併它們的softmax輸出。這立即將驗證精度提高到0.765!
對於大多數監督學習問題,整體方法傾向於優於單一模型方法。目前理解這是因為它能夠橫穿假設空間。一個集合能夠得出一個更好的假設,這個假設不在其構建的單一模型的假設空間中。
根據經驗,當模型之間存在多樣性時,集合傾向於產生更好的結果。從下面顯示的混亂矩陣中,可以看到Conv LSTM能夠採取向右滑動和更好地下蹲等動作,而UNet LSTM能夠採取像籃球射擊和更好地繪製x這樣的動作。這表明兩種模型之間存在模型多樣性,並且足夠真實,通過將它們集合在一起,得到的驗證精度從0.700和0.712到0.765!
Conv LSTM(上)和UNet LSTM(下)對慣性數據的混淆矩陣
下面是用來創建整體的等式。有關代碼實現,請參閱repo。
Conv LSTM和UNet LSTM的softmax輸出的平均值
動作j的Softmax輸出
結合Skeleton數據
為了實現標題中所述的承諾的80%驗證準確性,添加了Skeleton數據,並將其重新採樣到180個單位的時間段。在將其與6通道慣性數據融合後,得到(N,180,66)的輸入形狀,其中N是樣本數。下面彙編了所有驗證準確度的表格。
不同模型驗證準確性綜述
請注意,表現最佳的模型的混淆矩陣,驗證準確度為0.821,如下所示。
慣性+骨架數據上的集合混淆矩陣
結論
如果已經完全按照這些步驟操作,那麼就可以成功構建自己的人體動作分類器!
Model zoo
簡單的LSTM
雙向LSTM
Conv LSTM
UNet LSTM
一些關鍵的要點
繪圖是一種快速簡便的方法來理解您的數據
數據科學是一個高度迭代的過程
自動化您可以做的事情
Ensemble是一種快速獲得最佳訓練模型的方法
使用Google Colab提高您的培訓速度
Keras是深度學習模型快速原型設計的首選框架
如果正在接受挑戰,並認為0.821還不夠,可以閱讀以下小節以改進模型。
還有什麼可以做的
A.過度擬合的問題
在整個訓練過程中,早期時期的過度擬合似乎是面臨的主要經常性挑戰。嘗試添加Dropout圖層和集成,以使模型更加通用,但仍然可以更進一步。當模型試圖學習可能沒用的高頻特徵時,過度擬合往往會發生。在所有頻率中添加具有零均值和數據點的高斯噪聲可以增強模型的學習能力。同樣即使是相同的活動,不同科目的時間順序也各不相同。使用時間縮放和轉換執行數據增加將增加訓練數據的數量,從而允許模型更好地推廣。
另外模型也可以進一步削減,以降低其複雜性,以及過度擬合的風險。
B. RGB和深度數據的數據融合
使用了Inertial,在最後添加了Skeleton,以便提供更多信息,以便找到渴望數據的模型。為了更多地推動模型,必須找到將其與深度和RGB數據融合的方法。這將允許更多的輸入訓練變量來學習和提取特徵,從而提高驗證的準確性。
C.嘗試其他合奏學習技巧
可以嘗試更先進的集成學習方法,例如Boosting和Bagging,而不是簡單的平均值。
附錄
UNet LSTM模型的網絡圖
《深度學習之TensorFlow:入門、原理與進階實戰》和《Python帶我起飛——入門、進階、商業實戰》兩本圖書是代碼醫生團隊精心編著的 AI入門與提高的精品圖書。配套資源豐富:配套視頻、QQ讀者群、實例源碼、 配套論壇:http://bbs.aianaconda.com 。更多請見:aianaconda.com
點擊「閱讀原文」配套圖書資源