cnn神经网络可以用于数据拟合吗_时间序列中Keras中的一维卷积神经网络介绍

介绍

许多文章专注于二维卷积神经网络。 它们特别用于图像识别问题。 一维CNN涵盖了一定范围,例如 用于自然语言处理(NLP)。 尽管我们可能会遇到其他机器学习问题,但很少有文章提供有关如何构造一维CNN的解释性演练。 本文试图弥补这一差距。

何时应用一维CNN?

CNN可以很好地识别数据中的简单模式,然后将其用于在更高层中形成更复杂的模式。 当我们希望从整体数据集的较短(定长)片段中获得有趣的特征,并且该特征在该片段中的位置不相关时,一维CNN会非常有效。

这非常适用于分析传感器数据(例如陀螺仪或加速度计数据)的时间序列。 它还适用于在固定长度的时间段内分析任何种类的信号数据(例如音频信号)。 另一个应用是NLP(尽管在这里LSTM网络更有希望,因为单词的接近性可能并不总是可训练模式的良好指示)。

1D CNN和2D CNN有什么区别?

无论是1D,2D还是3D,CNN都具有相同的特征并采用相同的方法。 关键区别在于输入数据的维度以及特征检测器(或过滤器)如何在数据上滑动:

v2-1348edfddd0e3b60a507820312b01d1b_b.jpg

问题陈述

在本文中,我们将重点介绍时间分段的加速度传感器数据,这些数据来自用户腰间携带的智能手机。 根据x,y和z轴的加速度计数据,一维CNN应该预测用户正在执行的活动类型(例如“走路”,“慢跑”或“站立”)。 对于各种活动,数据的每个时间间隔看起来都与此相似。

v2-102b5b885bfdce689e2350096775d2f7_b.jpg

如何在Python中构建一维CNN?

有许多标准的CNN模型可用。 我选择了Keras网站上描述的模型之一,并对其进行了少许修改以适应上述问题。 下图提供了所构建模型的高级概述。 每层将进一步说明。

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

准确性:正确预测的结果与所有预测的总和之间的比率。 ((TP + TN)/(TP + TN + FP + FN))

精度:当模型预测为阳性时,对吗? 所有真实的积极因素除以所有积极的预测。 (TP /(TP + FP))

回想一下:模型从所有可能的阳性中识别出多少阳性? 真实肯定除以所有实际肯定。 (TP /(TP + FN))

F1分数:这是精度和召回率的加权平均值。 (2 x调用x精度/(调用+精度))

与测试数据相关的混淆矩阵如下所示

v2-1023174bae7e3b96755d379c3d061322_b.jpg

总结

在本文中,您已经看到了一个示例,该示例说明了如何使用一维CNN训练网络,以基于来自智能手机的一组给定的加速度计数据来预测用户行为。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值