董海山,徐曉姍,鄭春紅
(青島職業(yè)技術學院信息學院,青島266555)
近來像智能手機等移動設備加入了越來越多各式各樣功能強大的傳感器,這些傳感器包括:GPS傳感器、視覺傳感器(如攝像頭)、聽覺傳感器(如耳機)、光傳感器、溫度傳感器、方向傳感器(如指南針)和加速度傳感器(如加速計)。這些移動設備雖體積小,但計算能力強,可以發(fā)送和接受大量數(shù)據(jù),因此被大量的在我們日常生活中使用,也為數(shù)據(jù)挖掘的研究和應用開辟了新的領域。本文的目的就是通過利用智能手機所產生的傳感器數(shù)據(jù)來研究和實現(xiàn)可以識別人體室內行為的算法。
大部分Android智能手機及其他智能設備都配有加速度傳感器、重力傳感器和方向傳感器,這些傳感器不光具備測量立體空間的能力,還可以檢測方向(通過手機重力傳感器)。如果建立了通過傳感器數(shù)據(jù)識別人體室內行為的模型,我們就可以創(chuàng)建一些應用,例如自動生成用戶每天、每周甚至每月的活動報告,并自動發(fā)給用戶,報告中可以根據(jù)檢測的運動量給用戶一些運動乃至營養(yǎng)建議。同時行為信息還可以被用來匹配用戶行為,例如檢測到用戶在運動或睡覺,可以把電話自動轉到語音信箱,還可以有其他各種各樣的應用場景。通過手機傳感器可以測量出一段隨時間變化的三向加速度數(shù)據(jù),而活動也可以看成一個由時間和空間組合而成的一個序列,因此通過對傳感器數(shù)據(jù)的處理、判斷、分類,我們就可以有效的對室內活動進行識別。
本文所提出的構建基于LSTM模型的算法,對傳感器中獲取的數(shù)據(jù)進行表征學習,并對數(shù)據(jù)進行處理、分類,最終實現(xiàn)對人體活動的有效識別。實驗表明,本文所使用的算法在識別人體活動時具有較高的準確率,表明實驗方法的實際可行性。
深度學習是機器學習中一種基于對數(shù)據(jù)進行表征學習的方法[1]。它通過多層結構讓機器自動在數(shù)據(jù)里找到特征或者規(guī)律,從而對數(shù)據(jù)進行預測和分類,減少了人為設計特征造成的不完備性。
神經網絡[2]由大量的神經元相互連接而成。每個神經元在接受線性組合的輸入后,最開始只是簡單的線性加權,后來給每個神經元加上了非線性的激活函數(shù),并進行非線性變換后輸出,增強了神經元的表征能力。每兩個神經元之間的連接代表加權值,稱之為權重(weight)。不同的權重和激活函數(shù),會導致神經網絡不同的輸出。
RNN(Recurrent Neuron Network)是一種特殊的神經網絡結構[3],它是根據(jù)“人的認知是基于過往的經驗和記憶”這一觀點提出的。它與CNN(Convolutional Neural Network)不同的是:它不僅考慮前一時刻的輸入,而且賦予了網絡對前面的內容的一種“記憶”功能.。RNN所以稱為循環(huán)神經網路,即一個序列當前的輸出與前面的輸出也有關,具體的表現(xiàn)形式為網絡會對前面的信息進行記憶并應用于當前輸出的計算中,即隱藏層之間的節(jié)點不再無連接而是有連接的,并且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。
LSTM(Long Short Term Memory networks)神經網絡是一種特殊的RNN網絡[4],該網絡設計出來是為了解決長依賴問題。本文使用谷歌開源TensorFlow機器學習框架構建LSTM模型,模型主要包括了輸入層、LSTM層、輸出層、loss、optimizer等部分的構建。LSTM模型主要用于解決RNN模型中梯度消亡現(xiàn)象,如圖1所示,LSTM接受上一時刻的輸出結果,當前時刻的系統(tǒng)狀態(tài)和當前系統(tǒng)輸入,通過輸入門、遺忘門和輸出門更新系統(tǒng)狀態(tài)并將最終的結果進行輸出。如下公式為核心算法,輸入門為It,遺忘門為ft,輸出門為ot,遺忘門來決定上一時刻的狀態(tài)信息中某部分數(shù)據(jù)需要被遺忘,輸入門來決定當前輸入中某部分數(shù)據(jù)需要保留在狀態(tài)中,輸出門來決定由當前時刻的系統(tǒng)輸入、前一時刻的輸入和狀態(tài)信息組合而成的信息中那些部分可以作為最終的輸出[5]。
圖1 LSTM模型
活動識別的算法流程框架如圖2所示。首先對從手機傳感器上采集到的數(shù)據(jù)進行預處理,通過數(shù)據(jù)標準化使得訓練時能更快地收斂,并且不被異常值所影響;然后通過LSTM模型方法對人體典型活動進行學習,以實現(xiàn)不同活動的特征提??;最后進行活動的分類。
圖2 算法流程
生活中的活動各種各樣,為了更好地、更精確地識別人體行為特征,我們對人體典型行為分六大類:上樓(Upstairs)、下樓(Downstairs)、坐(Sitting)、站(Stand?ing)、慢跑(Jogging)、走路(Walking)。為了得到更有利于特征提取的形式,在對數(shù)據(jù)進行特征提取和識別之前,先要對原始數(shù)據(jù)進行預處理:本文利用標準分數(shù)進行數(shù)據(jù)標準化,同時對數(shù)據(jù)序列進行固定切片,每個序列包含200個訓練例子,如此可以保證這些特征都具有相近的尺度,幫助梯度下降算法更快地收斂,代碼如下:
N_TIME_STEPS=200
N_FEATURES=3
step=20
segments=[]
labels=[]
for Iin range(0,len(df)-N_TIME_STEPS,step):
xs=df[‘x-axis’].values[i:I+N_TIME_STEPS]
ys=df[‘y-axis’].values[i:I+N_TIME_STEPS]
zs=df[‘z-axis’].values[i:I+N_TIME_STEPS]
label=stats.mode(df[‘activity’][i:I+N_TIME_STEPS])[0][0]
segments.append([xs,ys,zs])
labels.append(label)
對標準化的數(shù)據(jù)進行兩次卷積操作,卷積使用Re?LU激活函數(shù),并且在后面帶有最大池化層。同時使用tf.reshape函數(shù)對第二個卷積層的輸出進行變形,將其轉成一維向量,然后連接兩個全連層,隱含節(jié)點為100,并使用tanh激活函數(shù)。
為了減輕過擬合,增加一個Dropout層,通過placeholder傳入數(shù)值類控制。訓練時會隨機丟棄一分類相似數(shù)據(jù)來減輕過擬合,預測試則保留全部數(shù)據(jù)追求更高的預測性能。全連接層的輸出連接一個Soft?max層,得到最后的概率輸出。
N_CLASSES=6
N_HIDDEN_UNITS=64
def create_LSTM_model(inputs):
W={
‘hidden’:tf.Variable(tf.random_normal([N_FEATURES,N_HIDDEN_UNITS])),
‘output’: tf.Variable(tf.random_normal([N_HID?DEN_UNITS,N_CLASSES]))
}
biases={
‘hidden’: tf.Variable (tf.random_normal([N_HID?DEN_UNITS],mean=1.0)),
‘output’:tf.Variable(tf.random_normal([N_CLASSES]))
}
X=tf.transpose(inputs,[1,0,2])
X=tf.reshape(X,[-1,N_FEATURES])
hidden=tf.nn.relu(tf.matmul(X,W[‘hidden’])+biases[‘hidden’])
hidden=tf.split(hidden,N_TIME_STEPS,0)
lstm_layers = [tf.contrib.rnn.BasicLSTMCell(N_HID?DEN_UNITS,forget_bias=1.0)for_in range(2)]
lstm_layers=tf.contrib.rnn.MultiRNNCell(lstm_layers)
outputs,_=tf.contrib.rnn.static_rnn(lstm_layers,hidden,dtype=tf.float32)
lstm_last_output=outputs[-1]
return tf.matmul(lstm_last_output,W[‘output’])+biases[‘output’]
下面開始訓練過程。首先依然是初始化所有參數(shù)。共進行50次訓練迭代,參與訓練的樣本數(shù)量總共54901。其中每次訓練都分批次處理,同時我們會對準確率進行一次評測,用以實時監(jiān)測模型的性能,通過圖3可以看到模型的準確率大概在97%,損失值大約0.2。
saver=tf.train.Saver()
history=dict(train_loss=[],
train_acc=[],
test_loss=[],
test_acc=[])
sess=tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
train_count=len(X_train)
for iin range(1,N_EPOCHS+1):
for start,end in zip(range(0,train_count,BATCH_SIZE),
range(BATCH_SIZE,train_count+1,BATCH_SIZE)):
sess.run(optimizer,feed_dict={X:X_train[start:end],
Y:y_train[start:end]})
_,acc_train,loss_train=sess.run([pred_softmax,accuracy,loss],feed_dict={
X:X_train,Y:y_train})
_,acc_test,loss_test=sess.run([pred_softmax,accuracy,loss],feed_dict={
X:X_test,Y:y_test})
history['train_loss'].append(loss_train)
history['train_acc'].append(acc_train)
history['test_loss'].append(loss_test)
history['test_acc'].append(acc_test)
ifi!=1andi%10!=0:
continue
print(f'epoch:{i}testaccuracy:{acc_test}loss:{loss_test}')
predictions,acc_final,loss_final=sess.run([pred_softmax,ac?
curacy,loss],feed_dict={X:X_test,Y:y_test})
print()
print(f'finalresults:accuracy:{acc_final}loss:{loss_final}')
圖3 訓練過程
深度學習結果的準確性判定比較復雜,一般基于個人經驗的,沒有嚴格的數(shù)學和理論來支持和計算準確度,絕大多數(shù)研究使用交叉驗證和統(tǒng)計測試來比較分類器對特定數(shù)據(jù)集的性能,本文選取20%樣本數(shù)據(jù)作為測試集。針對具有n個類別的分類問題,針對特定方法的分類結果可以被保存在混淆矩陣Mn×n中?;煜仃嚳梢允沟迷豈ij的值等于實際分類為類j的來自類別i的實例的數(shù)量。
該程序運行的效果如圖5所示,主界面顯示六大類活動的名稱及概率值,最高概率的即為模型所預測的活動,非常直觀。
本文首先介紹了深度學習和RNN神經網絡的基本概念,其次給出了LSTM模型的思想和算法設計,然后介紹使用TensorFlow標準化數(shù)據(jù)、創(chuàng)建訓練LSTM模型并評估效果,最后實現(xiàn)了一個簡單應用:根據(jù)手機持有人的活動預測其行為。與傳統(tǒng)的識別方法相比,本方法無需人為地優(yōu)選特征即可有效識別相似動作,如走、上樓、下樓、慢跑、站和坐,能明顯提高人體行為的識別率,可在實際應用中實時使用,是一種理想的分類模型。
圖4 混淆矩陣
圖5應用界面