介绍

许多文章关注二维卷积神经网络。它们特别用于图像识别问题。1D CNN在一定程度上被涵盖,例如用于自然语言处理(NLP)。很少有文章解释如何构建一个1D CNN。本文试图弥补这一差距。

什么时候应用1D CNN?

CNN可以很好地识别数据中的简单模式,然后使用这些模式在更高的层中形成更复杂的模式。当您希望从整体数据集的较短(固定长度)片段中获得有趣的特征,且特征在片段中的位置相关性不高时,1D CNN非常有效。

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

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

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

问题陈述

在本文中,我们将重点关注加速度传感器采集的时间序列数据,数据地址为:https://www.cis.fordham.edu/wisdm/dataset.php。这些数据来自用户腰部携带的智能手机。基于x、y和z轴的加速度计数据,1D CNN预测用户正在进行的活动类型(如“步行”、“慢跑”或“站立”)。对于各种活动,数据的每个时间间隔看起来与此类似。

如何在Python中构造一个一维CNN ?

有许多标准的CNN模型可供选择。我选择了Keras网站上描述的一个模型,并对其进行了稍微修改,以适应上面描述的问题。下面的图片提供了构建模型的高级概览。将进一步解释每一层。

让我们首先看一下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个时间片(数据以20Hz采样率记录,因此每个时间间隔包含加速度计读取的4秒数据)。在每个时间间隔内,存储x轴、y轴和z轴的三个加速度计值。这就得到了一个80x3矩阵。由于我通常在iOS中使用神经网络,所以数据必须作为长度为240的平面向量传递到神经网络中。网络的第一层必须将其重塑为原来的形状,即80 x 3。
  • 第一1D CNN层: 一个高度为10(也称为内核大小)的过滤器(或也称为特征检测器)。只定义一个过滤器将允许神经网络学习第一层中的一个单一特征。这可能还不够,因此我们将定义100个过滤器。这允许我们在网络的第一层训练100个不同的特征。第一个神经网络层的输出是一个71 x 100的神经元矩阵。输出矩阵的每一列包含一个过滤器的权重。根据定义的内核大小和考虑输入矩阵的长度,每个过滤器将包含71个权重。
  • 第二个一维CNN层:第一个CNN的结果将被输入第二个CNN层。我们将再次定义100个不同的过滤器在这个级别上进行训练。按照与第一层相同的逻辑,输出矩阵的大小将为62 x 100。
  • 最大池化层: 为了降低输出的复杂性,防止数据过拟合,在CNN层之后,通常使用pooling层。在我们的例子中,我们选择的大小为3。这意味着该层的输出矩阵的大小只有输入矩阵的三分之一。
  • 第三和第四个一维CNN层: 下面是一维CNN层的另一个序列,以便学习更高层次的特征。这两层之后的输出矩阵是一个2x160矩阵。
  • 平均池化层: 多一个池化层,进一步避免过拟合。这次不是取最大值,而是取神经网络中两个权值的平均值。输出矩阵的大小为1 x 160个神经元。每个特征检测器在这一层的神经网络中只剩下一个权值。
  • Dropout层: Dropout层将随机分配权值0给网络中的神经元。因为我们选择了0.5的概率,50%的神经元将获得0权值。通过这种操作,网络对数据中较小的变化不那么敏感。因此,它应该进一步提高我们对不可见数据的准确性。这一层的输出仍然是1×160个神经元矩阵。
  • 使用Softmax激活的全连接层: 最后一层将高度160的向量减少到6,因为我们要预测6个类(“慢跑”、“坐下”、“行走”、“站立”、“上楼”、“下楼”)。这由一个矩阵乘法完成。使用Softmax作为激活函数。它使神经网络的所有6个输出加起来等于1。因此,输出值将表示这六个类中的每个类的概率。

神经网络的训练与测试

下面是训练模型的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 = 50history = 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

考虑到我们使用的是标准1D 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

以下是对这些分数含义的简要回顾:

  • 准确度: 正确预测结果与所有预测结果之和之间的比率。((TP+TN)/(TP+TN+FP+FN))((TP + TN) / (TP + TN + FP + FN))((TP+TN)/(TP+TN+FP+FN))
  • 精确度: 当模型预测为正例时,所有正确的预测除以所有正例。(TP/ (TP + FP))
    Recall: 在所有可能的正例中,模型确定了多少正例呢?真正的正例除以所有实际的正例。(TP/(TP+FN))(TP / (TP +FN))(TP/(TP+FN))
    F1-score: 精确度和召回率的加权平均值。(2xrecallxprecision/(recall+precision))(2 x recall x precision / (recall + precision))(2xrecallxprecision/(recall+precision))

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

完整源代码下载

参考

一维卷积神经网络的Keras文档
Keras的一维卷积神经网络的例子
一篇介绍一维cnn自然语言处理问题的好文章

基于keras的1D CNN时间序列分析相关推荐

  1. 基于小波分析和机器学习的时间序列分析与识别

    研究对象:ECG等时间序列信号 方法:小波变换,简单神经网络 首先导入相关模块,需要安装尺度谱模块:pip install scaleogram 和mat4py模块:pip install mat4p ...

  2. 【AI易操作-深度学习算法代码解读】基于keras实现图像识别CNN模型-含CNN卷积神经网络模型原理

    图像识别为什么要用卷积神经网络CNN?比传统神经网络好在哪里? 核心差别点:多了卷积层+池化层,所以本文主要是梳理卷积层和池化层设计原理+CNN模型实现(基于Keras代码) 传统神经网络的劣势 我们 ...

  3. 独家 | Python时间序列分析:一项基于案例的全面指南

    作者: Selva Prabhakaran 翻译:陈超校对:王可汗本文约7500字,建议阅读20+分钟本文介绍了时间序列的定义.特征并结合实例给出了时间序列在Python中评价指标和方法. 时间序列是 ...

  4. 基于Keras搭建CNN、TextCNN文本分类模型

    基于Keras搭建CNN.TextCNN文本分类模型 一.CNN 1.1 数据读取分词 1.2.数据编码 1.3 数据序列标准化 1.4 构建模型 1.5 模型验证 二.TextCNN文本分类 2.1 ...

  5. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...

  6. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 1.10 ...

  7. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 from keras.callbacks ...

  8. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 def mini_XCEPTION(inp ...

  9. Keras之CNN:基于Keras利用cv2建立训练存储卷积神经网络模型(2+1)并调用摄像头进行实时人脸识别

    Keras之CNN:基于Keras利用cv2建立训练存储卷积神经网络模型(2+1)并调用摄像头进行实时人脸识别 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 # -*- codin ...

最新文章

  1. 零基础入门学习Python,我与python的第一次亲密接触后的感受!
  2. Android中实现双击屏幕跳转
  3. Redis:redis和memcached 比较
  4. python enumerate用法总结(转)
  5. stm32的rxne和idle中断_STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
  6. C#生成图形验证码 (转)
  7. JS及java验证 IPV6,IPV4地址的 正则表达式
  8. linux下获取微秒级精度的时间【转】
  9. 【MFC开发(5)】单选按钮控件RADIOBUTTON
  10. 工业互联网常用无线通信协议介绍(详细版)
  11. 操作系统第二章课后答案
  12. 主流开源 BI 产品对比
  13. 小米获取屏幕高度不准确-小米获取屏幕高度的兼容方案
  14. 计算机 word 节是什么,Word分节符的含义和使用方法详解-word技巧-电脑技巧收藏家...
  15. (转)一些jbx的配置
  16. H3C路由器配置忘记密码恢复
  17. java运行速度慢的原因_java运行速度慢的原因 | 学步园
  18. 最大开源代码sourceforge 简介 及视音频方面常用的开源代码
  19. 让人拍案叫绝的创意是如何产生的
  20. 耦合性(或称“耦合度”)

热门文章

  1. 教育知识与能力·中学
  2. OTM应用能解决人工智能领域的数据安全问题
  3. table css个人简历的实现 美观 简洁
  4. 电商项目_dwd主题域
  5. Python011: Python大作业之移动的小火车动画(四)代码实现
  6. 太阳能监控摄像头电不够用
  7. 走访最没存在感的省份之一,经济仍有潜力
  8. 教师资格证科目二备考重点总结
  9. 十诫诗串词_持续交付的十诫
  10. python3数据经base64解码后带b'的解决办法