介绍
许多文章专注于二维卷积神经网络。 它们特别用于图像识别问题。 一维CNN涵盖了一定范围,例如 用于自然语言处理(NLP)。 尽管我们可能会遇到其他机器学习问题,但很少有文章提供有关如何构造一维CNN的解释性演练。 本文试图弥补这一差距。
何时应用一维CNN?
CNN可以很好地识别数据中的简单模式,然后将其用于在更高层中形成更复杂的模式。 当我们希望从整体数据集的较短(定长)片段中获得有趣的特征,并且该特征在该片段中的位置不相关时,一维CNN会非常有效。
这非常适用于分析传感器数据(例如陀螺仪或加速度计数据)的时间序列。 它还适用于在固定长度的时间段内分析任何种类的信号数据(例如音频信号)。 另一个应用是NLP(尽管在这里LSTM网络更有希望,因为单词的接近性可能并不总是可训练模式的良好指示)。
1D CNN和2D CNN有什么区别?
无论是1D,2D还是3D,CNN都具有相同的特征并采用相同的方法。 关键区别在于输入数据的维度以及特征检测器(或过滤器)如何在数据上滑动:
![v2-1348edfddd0e3b60a507820312b01d1b_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=9eb6f7c5-0e30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-1348edfddd0e3b60a507820312b01d1b_b.jpg)
问题陈述
在本文中,我们将重点介绍时间分段的加速度传感器数据,这些数据来自用户腰间携带的智能手机。 根据x,y和z轴的加速度计数据,一维CNN应该预测用户正在执行的活动类型(例如“走路”,“慢跑”或“站立”)。 对于各种活动,数据的每个时间间隔看起来都与此相似。
![v2-102b5b885bfdce689e2350096775d2f7_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=9eb6f7c5-0e30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-102b5b885bfdce689e2350096775d2f7_b.jpg)
如何在Python中构建一维CNN?
有许多标准的CNN模型可用。 我选择了Keras网站上描述的模型之一,并对其进行了少许修改以适应上述问题。 下图提供了所构建模型的高级概述。 每层将进一步说明。
![v2-cb243c83fef353c4e041b91432493a70_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=9eb6f7c5-0e30-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-cb243c83fef353c4e041b91432493a70_b.jpg)
但首先让我们看一下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个时间片(数据以20 Hz采样率记录,因此每个时间间隔覆盖了加速度计读数的四秒钟)。在每个时间间隔内,将存储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层之后使用池层。在我们的示例中,我们选择了三个大小。这意味着该层的输出矩阵的大小仅为输入矩阵的三分之一。
第三和第四1D CNN层:接下来是1D CNN层的另一序列,以学习更高级别的功能。在这两层之后的输出矩阵是2 x 160矩阵。
平均池化层:多一层池化,以进一步避免过度拟合。这次不是取最大值,而是取神经网络中两个权重的平均值。输出矩阵的大小为1 x 160个神经元。每个特征检测器在这一层的神经网络中仅剩一个权重。
辍学层:辍学层将为网络中的神经元随机分配0权重。由于我们选择的比率为0.5,因此50%的神经元的权重为零。通过此操作,网络对数据的较小变化变得不那么敏感。因此,它应该进一步提高我们对看不见的数据的准确性。该层的输出仍然是1 x 160的神经元矩阵。
具有Softmax激活的完全连接的层:由于我们要预测六类(“慢跑”,“坐着”,“行走”,“站立”,“楼上楼下”)。这种减少是通过另一个矩阵乘法完成的。 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
考虑到我们使用了标准的一维CNN模型之一,这是一个很好的数字。 我们的模型在准确性,召回率和f1得分上也得分很高。
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
以下是这些分数的简要说明:
![v2-e6e9be5e3bea4eca64cd34d2bdbce3d6_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=9eb6f7c5-0e30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-e6e9be5e3bea4eca64cd34d2bdbce3d6_b.jpg)
准确性:正确预测的结果与所有预测的总和之间的比率。 ((TP + TN)/(TP + TN + FP + FN))
精度:当模型预测为阳性时,对吗? 所有真实的积极因素除以所有积极的预测。 (TP /(TP + FP))
回想一下:模型从所有可能的阳性中识别出多少阳性? 真实肯定除以所有实际肯定。 (TP /(TP + FN))
F1分数:这是精度和召回率的加权平均值。 (2 x调用x精度/(调用+精度))
与测试数据相关的混淆矩阵如下所示
![v2-1023174bae7e3b96755d379c3d061322_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=9eb6f7c5-0e30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-1023174bae7e3b96755d379c3d061322_b.jpg)
总结
在本文中,您已经看到了一个示例,该示例说明了如何使用一维CNN训练网络,以基于来自智能手机的一组给定的加速度计数据来预测用户行为。