成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何基于TensorFlow使用LSTM和CNN實現時序分類任務

企業動態
在本文中,我們將討論如何使用深度學習方法對時序數據進行分類。我們使用的案例是 UCI 項目中的人體活動識別(HAR)數據集。

時序數據經常出現在很多領域中,如金融、信號處理、語音識別和醫藥。傳統的時序問題通常首先需要人力進行特征工程,才能將預處理的數據輸入到機器學習算法中。并且這種特征工程通常需要一些特定領域內的專業知識,因此也就更進一步加大了預處理成本。例如信號處理(即 EEG 信號分類),特征工程可能就涉及到各種頻帶的功率譜(power spectra)、Hjorth 參數和其他一些特定的統計學特征。本文簡要地介紹了使用 CNN 和 LSTM 實現序列分類的方法,詳細代碼請查看 Github。

Github 項目地址:https://github.com/healthDataScience/deep-learning-HAR

傳統圖像分類中也是采用的手動特征工程,然而隨著深度學習的出現,卷積神經網絡已經可以較為***地處理計算機視覺任務。使用 CNN 處理圖像不需要任何手動特征工程,網絡會一層層自動從最基本的特征組合成更加高級和抽象的特征,從而完成計算機視覺任務。

在本文中,我們將討論如何使用深度學習方法對時序數據進行分類。我們使用的案例是 UCI 項目中的人體活動識別(HAR)數據集。該數據集包含原始的時序數據和經預處理的數據(包含 561 個特征)。本文將對比用特征工程的機器學習算法和兩種深度學習方法(卷積神經網絡和循環神經網絡),試驗***表明深度學習方法超越了傳統使用特征工程的方法。

作者使用 TensorFlow 和實現并訓練模型,文中只展示了部分代碼,更詳細的代碼請查看 Github。

卷積神經網絡(CNN)

首先***步就是將數據饋送到 Numpy 中的數組,且數組的維度為 (batch_size, seq_len, n_channels),其中 batch_size 為模型在執行 SGD 時每一次迭代需要的數據量,seq_len 為時序序列的長度(本文中為 128),n_channels 為執行檢測(measurement)的通道數。本文案例中通道數為 9,即 3 個坐標軸每一個有 3 個不同的加速檢測

(acceleration measurement)。我們有六個活動標簽,即每一個樣本屬于 LAYING、STANDING、SITTING、WALKING_DOWNSTAIRS、WALKING_UPSTAIRS 或 WALKING。

下面,我們首先構建計算圖,其中我們使用占位符為輸入數據做準備:

  1. graph = tf.Graph()  
  2. with graph.as_default(): 
  3.     inputs_ = tf.placeholder(tf.float32, [None, seq_len, n_channels], 
  4.         name = 'inputs'
  5.     labels_ = tf.placeholder(tf.float32, [None, n_classes], name = 'labels'
  6.     keep_prob_ = tf.placeholder(tf.float32, name = 'keep'
  7.     learning_rate_ = tf.placeholder(tf.float32, name = 'l 

其中 inputs_是饋送到計算圖中的輸入張量,***個參數設置為「None」可以確保占位符***個維度可以根據不同的批量大小而適當調整。labels_是需要預測的 one-hot 編碼標簽,keep_prob_為用于 dropout 正則化的保持概率,learning_rate_ 為用于 Adam 優化器的學習率。

我們使用在序列上移動的 1 維卷積核構建卷積層,圖像一般使用的是 2 維卷積核。序列任務中的卷積核可以充當為訓練中的濾波器。在許多 CNN 架構中,層級的深度越大,濾波器的數量就越多。每一個卷積操作后面都跟隨著池化層以減少序列的長度。下面是我們可以使用的簡單 CNN 架構。

簡單 CNN 架構

上圖描述的卷積層可用以下代碼實現:

  1. with graph.as_default(): 
  2.     # (batch, 128, 9) -> (batch, 32, 18) 
  3.     conv1 = tf.layers.conv1d(inputs=inputs_filters=18kernel_size=2strides=1
  4.         padding='same'activation = tf.nn.relu) 
  5.     max_pool_1 = tf.layers.max_pooling1d(inputs=conv1pool_size=4strides=4padding='same'
  6.   
  7.     # (batch, 32, 18) -> (batch, 8, 36) 
  8.     conv2 = tf.layers.conv1d(inputs=max_pool_1filters=36kernel_size=2strides=1
  9.     padding='same'activation = tf.nn.relu) 
  10.     max_pool_2 = tf.layers.max_pooling1d(inputs=conv2pool_size=4strides=4padding='same'
  11.   
  12.     # (batch, 8, 36) -> (batch, 2, 72) 
  13.     conv3 = tf.layers.conv1d(inputs=max_pool_2filters=72kernel_size=2strides=1
  14.     padding='same'activation = tf.nn.relu) 
  15.     max_pool_3 = tf.layers.max_pooling1d(inputs=conv3, po 

一旦到達了***一層,我們需要 flatten 張量并投入到有適當神經元數的分類器中,在上圖中為 144 個神經元。隨后分類器輸出 logits,并用于以下兩種案例:

  1. 計算 softmax 交叉熵函數,該損失函數在多類別問題中是標準的損失度量。
  2. 在***化概率和準確度的情況下預測類別標簽。

下面是上述過程的實現:

  1. with graph.as_default(): 
  2.     # Flatten and add dropout 
  3.     flat = tf.reshape(max_pool_3, (-1, 2*72)) 
  4.     flat = tf.nn.dropout(flat, keep_prob=keep_prob_
  5.   
  6.     # Predictions 
  7.     logits = tf.layers.dense(flat, n_classes) 
  8.   
  9.     # Cost function and optimizer 
  10.     cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logitslogits=logits, 
  11.         labels=labels_))    optimizer = tf.train.AdamOptimizer(learning_rate_).minimize(cost) 
  12.   
  13.     # Accuracy 
  14.     correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax 

剩下的實現部分就比較典型了,讀者可查看 GitHub 中的完整代碼和過程。前面我們已經構建了計算圖,后面就需要將批量訓練數據饋送到計算圖進行訓練,同時我們還要使用驗證集來評估訓練結果。***,完成訓練的模型將在測試集上進行評估。我們在該實驗中 batch_siza 使用的是 600、learning_rate 使用的是 0.001、keep_prob 為 0.5。在 500 個 epoch 后,我們得到的測試精度為 98%。下圖顯示了訓練準確度和驗證準確度隨 epoch 的增加而顯示的變化:

訓練準確度和驗證準確度隨 epoch 的增加而顯示的變化

長短期記憶網絡(LSTM)

LSTM 在處理文本數據上十分流行,它在情感分析、機器翻譯、和文本生成等方面取得了十分顯著的成果。因為本問題涉及相似分類的序列,所以 LSTM 是比較優秀的方法。

下面是能用于該問題的神經網絡架構:

能用于該問題的神經網絡架構

為了將數據饋送到網絡中,我們需要將數組分割為 128 塊(序列中的每一塊都會進入一個 LSTM 單元),每一塊的維度為(batch_size, n_channels)。隨后單層神經元將轉換這些輸入并饋送到 LSTM 單元中,每一個 LSTM 單元的維度為 lstm_size,一般該參數需要選定為大于通道數量。這種方式很像文本應用中的嵌入層,其中詞匯從給定的詞匯表中嵌入為一個向量。后面我們需要選擇 LSTM 層的數量(lstm_layers),我們可以設定為 2。

對于這一個實現,占位符的設定可以和上面一樣。下面的代碼段實現了 LSTM 層級:

  1. with graph.as_default(): 
  2.     # Construct the LSTM inputs and LSTM cells 
  3.     lstm_in = tf.transpose(inputs_, [1,0,2]) # reshape into (seq_len, N, channels) 
  4.     lstm_in = tf.reshape(lstm_in, [-1, n_channels]) # Now (seq_len*N, n_channels) 
  5.   
  6.     # To cells 
  7.     lstm_in = tf.layers.dense(lstm_in, lstm_size, activation=None
  8.   
  9.     # Open up the tensor into a list of seq_len pieces 
  10.     lstm_in = tf.split(lstm_in, seq_len, 0) 
  11.   
  12.     # Add LSTM layers 
  13.     lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size) 
  14.     drop = tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=keep_prob_
  15.     cell = tf.contrib.rnn.MultiRNNCell([drop] * lstm_layers) 
  16.     initial_state = cell.zero_state(batch_size, tf.floa 

上面的代碼段是十分重要的技術細節。我們首先需要將數組從 (batch_size, seq_len, n_channels) 重建維度為 (seq_len, batch_size, n_channels),因此 tf.split 將在每一步適當地分割數據(根據第 0 個索引)為一系列 (batch_size, lstm_size) 數組。剩下的部分就是標準的 LSTM 實現了,包括構建層級和初始狀態。

下一步就是實現網絡的前向傳播和成本函數。比較重要的技術點是我們引入了梯度截斷,因為梯度截斷可以在反向傳播中防止梯度爆炸而提升訓練效果。

下面是我們定義前向傳播和成本函數的代碼:

  1. with graph.as_default(): 
  2.     outputs, final_state = tf.contrib.rnn.static_rnn(cell, lstm_in, dtype=tf.float32, 
  3.         initial_stateinitial_state = initial_state) 
  4.   
  5.     # We only need the last output tensor to pass into a classifier 
  6.     logits = tf.layers.dense(outputs[-1], n_classes, name='logits'
  7.   
  8.     # Cost function and optimizer 
  9.     cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logitslogits=logits, labels=labels_)) 
  10.   
  11.     # Grad clipping 
  12.     train_op = tf.train.AdamOptimizer(learning_rate_)  
  13.     gradients = train_op.compute_gradients(cost)    capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gradients]    optimizer = train_op.apply_gradients(capped_gradients) 
  14.   
  15.     # Accuracy 
  16.     correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax 

注意我們只使用了 LSTM 頂層輸出序列的***一個元素,因為我們每個序列只是嘗試預測一個分類概率。剩下的部分和前面我們訓練 CNN 的過程相似,我們只需要將數據饋送到計算圖中進行訓練。其中超參數可選擇為 lstm_size=27、lstm_layers=2、batch_size=600、learning_rate=0.0005 和 keep_prob=0.5,我們在測試集中可獲得大約 95% 的準確度。這一結果要比 CNN 還差一些,但仍然十分優秀。可能選擇其它超參數能產生更好的結果,讀者朋友也可以在 Github 中獲取源代碼并進一步調試。

對比傳統方法

前面作者已經使用帶 561 個特征的數據集測試了一些機器學習方法,性能***的方法是梯度提升樹,如下梯度提升樹的準確度能到達 96%。雖然 CNN、LSTM 架構與經過特征工程的梯度提升樹的精度差不多,但 CNN 和 LSTM 的人工工作量要少得多。

HAR 任務經典機器學習方法:

https://github.com/bhimmetoglu/talks-and-lectures/tree/master/MachineLearning/HAR

梯度提升樹:https://rpubs.com/burakh/har_xgb

結語

在本文中,我們試驗了使用 CNN 和 LSTM 進行時序數據的分類,這兩種方法在性能上都有十分優秀的表現,并且最重要的是它們在訓練中會一層層學習獨特的特征,它們不需要成本昂貴的特征工程。

本文所使用的序列還是比較小的,只有 128 步。可能會有讀者懷疑如果序列變得更長(甚至大于 1000),是不是訓練就會變得十分困難。其實我們可以結合 LSTM 和 CNN 在這種長序列任務中表現得更好。總的來說,深度學習方法相對于傳統方法有非常明顯的優勢。

【本文是51CTO專欄機構“機器之心”的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-11-23 14:35:36

2024-12-16 08:06:42

2022-12-09 14:50:51

機器學習時間序列預測

2018-08-30 09:36:10

編程語言Python機器學習

2022-06-29 09:00:00

前端圖像分類模型SQL

2020-10-27 09:37:43

PyTorchTensorFlow機器學習

2017-05-12 16:25:44

深度學習圖像補全tensorflow

2024-12-17 15:39:33

2018-04-16 11:30:32

深度學習

2018-04-17 09:40:22

深度學習

2018-04-11 09:30:41

深度學習

2023-05-14 22:35:24

TensorFlowKeras深度學習

2023-01-11 07:28:49

TensorFlow分類模型

2025-05-23 09:18:25

2022-06-29 14:06:54

canvas鴻蒙

2010-06-10 09:49:38

UML時序圖

2017-05-22 13:15:45

TensorFlow深度學習

2023-11-22 09:00:00

NLP語言模型LSTM

2018-07-04 15:17:07

CNNNLP模型

2022-08-16 09:00:00

機器學習人工智能數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品午夜视频免费 | 久久精品一区二区三区四区 | 日韩在线欧美 | 午夜精品影院 | 超碰在线亚洲 | 日韩成人高清 | 男人午夜视频 | 高清18麻豆 | 97久久久久久 | 福利成人| 久久一区二区三区四区 | 一区二区精品在线 | 免费观看av | 91亚洲欧美 | 91免费在线 | 在线观看亚洲精品 | 国产探花在线观看视频 | 九九综合 | 欧美a级成人淫片免费看 | 日韩欧美一区二区三区 | 久久精品综合网 | 欧美日韩在线综合 | 久久精品二区亚洲w码 | 久草在线中文888 | 精品无码久久久久久国产 | 91精品国产自产精品男人的天堂 | 丁香婷婷综合激情五月色 | 91久久精品日日躁夜夜躁国产 | 国产免费自拍 | 色在线免费视频 | 成人免费大片黄在线播放 | 久久国产麻豆 | www国产精品 | 日韩精品久久久久 | 久久99精品久久久 | 精品亚洲一区二区 | 国产一区在线免费 | 精品福利一区二区三区 | 色狠狠一区 | 亚洲激情综合 | 精品一区二区三区四区 |