精华内容
下载资源
问答
  • 一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来解决你可能正面临的一些机器学习问题。本文试图补上这样一个短板...

    为了方便读者理解一维卷积应用,请配合笔者的实战文章一起食用:

    1.[深度应用]·首届中国心电智能大赛初赛开源Baseline(基于Keras val_acc: 0.88)

    2.[深度应用]·DC竞赛轴承故障检测开源Baseline(基于Keras1D卷积 val_acc:0.99780)

    3.https://github.com/xiaosongshine/bearing_detection_by_conv1d

    4.『带你学AI』带你学AI与TensorFlow2实战之入门初探:如何速成深度学习开发

    5.笔者深度学公众号《简明AI》:

    极简AI公众号
    极简AI公众号

     

    概述

    许多技术文章都关注于二维卷积神经网络(2D CNN)的使用,特别是在图像识别中的应用。而一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来解决你可能正面临的一些机器学习问题。

    本文试图补上这样一个短板。

     

     

     

     

    何时应用 1D CNN?

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

    1D CNN 可以很好地应用于传感器数据的时间序列分析(比如陀螺仪或加速度计数据);同样也可以很好地用于分析具有固定长度周期的信号数据(比如音频信号)。此外,它还能应用于自然语言处理的任务(由于单词的接近性可能并不总是一个可训练模式的好指标,因此 LSTM 网络在 NLP 中的应用更有前途)。

     

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

     

    无论是一维、二维还是三维,卷积神经网络(CNNs)都具有相同的特点和相同的处理方法。关键区别在于输入数据的维数以及特征检测器(或滤波器)如何在数据之间滑动:

     

     

     

     

     

    问题描述

    在本文中,我们将专注于基于时间片的加速度传感器数据的处理,这些数据来自于用户的腰带式智能手机设备。基于 x、y 和 z 轴的加速度计数据,1D CNN 用来预测用户正在进行的活动类型(比如“步行”、“慢跑”或“站立”)。你可以在我的另外两篇文章中找到更多的信息 这里 和 这里。对于各种活动,在每个时间间隔上的数据看起来都与此类似。

     

    来自加速度计数据的时间序列样例

     

    如何在 PYTHON 中构造一个 1D 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 轴的三个数据。这样就得到了一个 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 层之后经常会使用池化层。在我们的示例中,我们选择了大小为 3 的池化层。这意味着这个层的输出矩阵的大小只有输入矩阵的三分之一。

    • 第三和第四个 1D CNN 层: 为了学习更高层次的特征,这里又使用了另外两个 1D CNN 层。这两层之后的输出矩阵是一个 2 x 160 的矩阵。

    • 平均值池化层: 多添加一个池化层,以进一步避免过拟合的发生。这次的池化不是取最大值,而是取神经网络中两个权重的平均值。输出矩阵的大小为 1 x 160 。每个特征检测器在神经网络的这一层中只剩下一个权重。

    • Dropout 层: Dropout 层会随机地为网络中的神经元赋值零权重。由于我们选择了 0.5 的比率,则 50% 的神经元将会是零权重的。通过这种操作,网络对数据的微小变化的响应就不那么敏感了。因此,它能够进一步提高对不可见数据处理的准确性。这个层的输出仍然是一个 1 x 160 的矩阵。

    • 使用 Softmax 激活的全连接层: 最后一层将会把长度为 160 的向量降为长度为 6 的向量,因为我们有 6 个类别要进行预测(即 “慢跑”、“坐下”、“走路”、“站立”、“上楼”、“下楼”)。这里的维度下降是通过另一个矩阵乘法来完成的。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
    

     

     

    总结

    本文通过以智能手机的加速度计数据来预测用户的行为为例,绍了如何使用 1D CNN 来训练网络。

     

    补充阅读

     

    1.[深度应用]·首届中国心电智能大赛初赛开源Baseline(基于Keras val_acc: 0.88)

    2.[深度应用]·DC竞赛轴承故障检测开源Baseline(基于Keras1D卷积 val_acc:0.99780)

    3.https://github.com/xiaosongshine/bearing_detection_by_conv1d

     

    欢迎Fork+Star,觉得有用的话,麻烦小小鼓励一下 ><

     

    欢迎大家关注小宋公众号《简明AI》带你学深度学习:这里收集了一些比较适合入门实战的PDF书籍,覆盖TensorFlow、PyTorch与MXNet。推荐的理由是通俗易懂,适合初学者研究学习。书籍列表如下:《简单粗暴TensorFlow2最新中文版》《动手学深度学习PyTorch最新中文版》《动手学深度学习MXNet最新中文版》
    关注后,回复:书籍,领取。

    基于深度学习的理论学习与应用开发技术分享,笔者会经常分享深度学习干货内容,大家在学习或者应用深度学习时,遇到什么问题也可以与我在上面交流知无不答。

    出自CSDN博客专家&知乎深度学习专栏作家@小宋是呢

    展开全文
  • 点击上方“AI与计算机视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达一维卷积介绍对于某些序列处理问题,这种一维卷积神经网络的效果可以媲美RNN,而且计算代价通常要小很多。一维卷积神经网络在音频生成和...

    点击上方“AI与计算机视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达37a729329cfa6ee50f575ef2673e24d8.png

    一维卷积介绍

    对于某些序列处理问题,这种一维卷积神经网络的效果可以媲美RNN,而且计算代价通常要小很多。

    一维卷积神经网络在音频生成和机器翻译领域取得了巨大成功。对于文本分类和时间序列预测等简单任务,小型的一维卷积神经网络可以代替RNN,而且速度更快。

    fefaaf0272527a0a843107d47cbf400a.png

    9fa680e158e8c24e8c14c464f437b659.png

    这种一维卷积层可以识别序列中的局部模式。因为对每个序列段执行相同的输入变换,所以在句子中某个位置学到的模式稍后可以在其他位置被识别,这使得一维卷积神经网络具有平移不变性。

    一维池化

    与二维池化类似,一维也可以做相同的池化运算:从输入中提取一维序列段(即子序列),然后输出其最大值(最大池化)或平均值(平均池化),池化运算也是用于降低一维输入的长度。

    一维卷积的实现

    Keras中的一维卷积神经网络是Conv1D层,它接收的输入是形状为(sample, time, features)的三位张量,并返回类似形状的三维张量。

    卷积窗口是时间轴上的一维窗口(时间轴是输入张量的第二个轴)。

    一维卷积神经网络可以使用更大的卷积窗口。相比二维卷积层,3×3的卷积窗口包含3×3=9个特征向量;但对于一维卷积层,大小为3的卷积窗口只包含3个卷积向量。因此,可以使用大小等于7或者9的一维卷积窗口。

    一维卷积叶子分类实例

    数据集:kaggle网站竞赛的叶子分类数据集

    环境:win10+pycharm+python3.6.8+TensorFlow2.2.0

    代码部分:

    # -*- coding: UTF-8 -*-"""Author: LGDFileName: leaf_classificationDateTime: 2021/1/4 16:47 SoftWare: PyCharm"""import tensorflow as tfimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitdata = pd.read_csv('train.csv')print(data.head())print(data.info())print('the leaf class: ', data.species.unique())print('the leaf class number: ', len(data.species.unique()))# 对label进行编码时可以使用独热编码,但是这里可以使用顺序编码labels = pd.factorize(data.species)[0]x = data[data.columns[2:]]# 使用train_test_split()划分训练集数据和测试集数据train_x, test_x, train_y, test_y = train_test_split(x, labels)print(train_x.shape, test_x.shape)  # (742, 192) (248, 192),data共有990条数据mean = train_x.mean(axis=0)  # axis=0代表1计算一列数据std = train_x.std(axis=0)# 数据标准化train_x = (train_x - mean)/stdtest_x = (test_x-mean)/std# 把每一条数据看成一个序列,本例中也即是将每一行数据看成一个序列# LSTM网络或者一维卷积要求的输入数据形状是samples,step,feature(样本数,步数,特征)train_x = np.expand_dims(train_x, -1)print('train shape: ', train_x.shape)  # train shape:  (742, 192, 1),刚好对应于(samples,step,feature)test_x = np.expand_dims(test_x, -1)# # ##############建立一维卷积模型################### model = tf.keras.Sequential()# model.add(tf.keras.layers.Conv1D(32, 7, input_shape=(train_x.shape[1:]), activation='relu', padding='same'))# model.add(tf.keras.layers.MaxPooling1D(3))# model.add(tf.keras.layers.Conv1D(32, 7, activation='relu', padding='same'))# model.add(tf.keras.layers.GlobalAveragePooling1D())# model.add(tf.keras.layers.Dense(99, activation='softmax'))## model.summary()## model.compile(#     optimizer=tf.keras.optimizers.RMSprop(),  # RMSprop()很适合处理序列问题#     loss='sparse_categorical_crossentropy',#     metrics=['acc']# )## history = model.fit(#     train_x,#     train_y,#     epochs=600,#     batch_size=128,#     validation_data=(test_x, test_y)# )## # 训练过程变化曲线# plt.plot(history.epoch, history.history.get('acc'), label='acc')# plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')# plt.legend()# plt.show()# 训练准确率过低,对模型的拟合能力有待进一步提高# 训练集准确率和测试集准确率后面产生巨大鸿沟,说明模型有过拟合现象出现# 对于训练数据的拟合不够问题需要增大网络容量或者说是增加网络深度,对于过拟合问题可以添加Dropout层# #############模型优化##############model = tf.keras.Sequential()model.add(tf.keras.layers.Conv1D(32, 7, activation='relu', padding='same', input_shape=(train_x.shape[1:])))model.add(tf.keras.layers.Conv1D(32, 7, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Conv1D(32, 7, activation='relu', padding='same'))model.add(tf.keras.layers.Conv1D(32, 7, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Conv1D(64, 7, activation='relu', padding='same'))model.add(tf.keras.layers.Conv1D(64, 7, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Conv1D(64, 7, activation='relu', padding='same'))model.add(tf.keras.layers.Conv1D(64, 7, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.GlobalAveragePooling1D())model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Dense(99, activation='softmax'))model.summary()model.compile(    optimizer=tf.keras.optimizers.RMSprop(),    loss='sparse_categorical_crossentropy',    metrics=['acc'])history = model.fit(    train_x,    train_y,    epochs=1000,    validation_data=(test_x, test_y),    batch_size=128)# 训练过程变化曲线plt.plot(history.epoch, history.history.get('acc'), label='acc')plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')plt.legend()plt.show()

    网络结构

    8994d520cde17f446f91b034714ffb84.png

    训练结构acc曲线图

    71d6160254af6b7244295c6e63469805.png

    模型优化

    拟合程度:网络层数、单元数

    过拟合:Dropout层、正则化

    继续优化:卷积核大小、增加Dense层

    优化后的代码

    model = tf.keras.Sequential()model.add(tf.keras.layers.Conv1D(64, 11, activation='relu', padding='same', input_shape=(train_x.shape[1:])))model.add(tf.keras.layers.Conv1D(64, 11, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Conv1D(128, 11, activation='relu', padding='same'))model.add(tf.keras.layers.Conv1D(128, 11, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Conv1D(256, 11, activation='relu', padding='same'))model.add(tf.keras.layers.Conv1D(256, 11, activation='relu', padding='same'))model.add(tf.keras.layers.MaxPooling1D(3))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Conv1D(512, 11, activation='relu', padding='same'))model.add(tf.keras.layers.Conv1D(512, 11, activation='relu', padding='same'))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.GlobalAveragePooling1D())model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Dense(256, activation='relu'))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Dense(99, activation='softmax'))model.summary()model.compile(    optimizer=tf.keras.optimizers.RMSprop(),    loss='sparse_categorical_crossentropy',    metrics=['acc'])history = model.fit(    train_x,    train_y,    epochs=350,    validation_data=(test_x, test_y),    batch_size=128)# 训练过程变化曲线plt.plot(history.epoch, history.history.get('acc'), label='acc')plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')plt.legend()plt.show()

    优化后的acc曲线图

    efdf85535a4d1e86b9164d727605b0ce.png

    ·END·

    微信号:AI与计算机视觉

    be1d4ac358abd122176f47edf13ac5b0.png

    展开全文
  • 前面两篇文章介绍的是卷积神经网络处理维数据,那么对于应用更多的一维时间序列数据,该如何用卷积神经网络来处理呢?概述许多文章都关注于二维卷积神经网络(2D CNN)的使用,特别是图像识别...

    前面两篇文章介绍的是卷积神经网络处理二维数据,那么对于应用更多的一维时间序列数据,该如何用卷积神经网络来处理呢?

    概述

    许多文章都关注于二维卷积神经网络(2D CNN)的使用,特别是图像识别。而一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来解决机器学习问题。

    何时应用 1D CNN?

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

    1D CNN 可以很好地应用于传感器数据的时间序列分析(比如陀螺仪或加速度计数据);同样也可以很好地用于分析具有固定长度周期的信号数据(比如音频信号)。此外,它还能应用于自然语言处理的任务(由于单词的接近性可能并不总是一个可训练模式的好指标,因此 LSTM 网络在 NLP 中的应用更有前途)。

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

    无论是一维、二维还是三维,卷积神经网络(CNNs)都具有相同的特点和相同的处理方法。关键区别在于输入数据的维数以及特征检测器(或滤波器)如何在数据之间滑动:

    问题描述

    在本文中,我们将专注于基于时间片的加速度传感器数据的处理,这些数据来自于用户的腰带式智能手机设备。基于 x、y 和 z 轴的加速度计数据,1D CNN 用来预测用户正在进行的活动类型(比如“步行”、“慢跑”或“站立”)。

    来自加速度计数据的时间序列样例

    如何在 Python 中构造一个 1D CNN?

    目前已经有许多标准 CNN 模型可用。我选择了 Keras 网站 上描述的一个模型,并对它进行了微调,以适应前面描述的问题。下面的图片对构建的模型进行一个高级概述。其中每一层都将会进一步加以解释。

    让我们深入到每一层中,看看到底发生了什么:

    输入数据: 数据经过预处理后,每条数据记录中包含有 80 个时间片(数据是以 20Hz 的采样频率进行记录的,因此每个时间间隔中就包含有 4 秒的加速度计数据)。在每个时间间隔内,存储加速度计的 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 层之后经常会使用池化层。在我们的示例中,我们选择了大小为 3 的池化层。这意味着这个层的输出矩阵的大小只有输入矩阵的三分之一。

    第三和第四个 1D CNN 层: 为了学习更高层次的特征,这里又使用了另外两个 1D CNN 层。这两层之后的输出矩阵是一个 2 x 160 的矩阵。

    平均值池化层: 多添加一个池化层,以进一步避免过拟合的发生。这次的池化不是取最大值,而是取神经网络中两个权重的平均值。输出矩阵的大小为 1 x 160 。每个特征检测器在神经网络的这一层中只剩下一个权重。

     Dropout 层: Dropout 层会随机地为网络中的神经元赋值零权重。由于我们选择了 0.5 的比率,则 50% 的神经元将会是零权重的。通过这种操作,网络对数据的微小变化的响应就不那么敏感了。因此,它能够进一步提高对不可见数据处理的准确性。这个层的输出仍然是一个 1 x 160 的矩阵。

    使用 Softmax 激活的全连接层: 最后一层将会把长度为 160 的向量降为长度为 6 的向量,因为我们有 6 个类别要进行预测(即 “慢跑”、“坐下”、“走路”、“站立”、“上楼”、“下楼”)。这里的维度下降是通过另一个矩阵乘法来完成的。Softmax 被用作激活函数。它强制神经网络的所有六个输出值的加和为一。因此,输出值将表示这六个类别中的每个类别出现的概率。

    训练和测试该神经网络

    下面是一段用以训练模型的 Python 代码,批大小为 400,其中训练集和验证集的分割比例是 80 :20。

    该模型在训练数据上的准确率可达 97%。

    根据测试集数据进行测试,其准确率为 92%。

    展望

    上面是以分类问题来举例的,对于回归预测问题,只需要把最后一层的全连接层使用linear激活即可~

    Attention

    如果你和我一样是轨道交通、交通运输、城市规划相关领域的,也愿意分享自己的科研生活,请加下面的二维码扫码进群,人数满员后加微信:Dr_JinleiZhang,备注“进群”,我会拉你进交通大数据分享群!不愿意分享的请勿打扰哈!希望我们共同进步!

    原文:Introduction to 1D ConvolutionalNeural Networks in Keras for Time Sequences

    译文:参考掘金翻译计划,作者有简化和评论。

    展开全文
  • 一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来解决你可能正面临的一些机器学习问题。本文试图补上这样一个短板。​...

    概述

    许多技术文章a都关注于二维卷积神经网络(2D CNN)的使用,特别是在图像识别中的应用。而一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来解决你可能正面临的一些机器学习问题。本文试图补上这样一个短板。

    何时应用 1D CNN?

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

    1D CNN 可以很好地应用于传感器数据的时间序列分析(比如陀螺仪或加速度计数据);同样也可以很好地用于分析具有固定长度周期的信号数据(比如音频信号)。此外,它还能应用于自然语言处理的任务(由于单词的接近性可能并不总是一个可训练模式的好指标,因此 LSTM 网络在 NLP 中的应用更有前途)。

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

    无论是一维、二维还是三维,卷积神经网络(CNNs)都具有相同的特点和相同的处理方法。关键区别在于输入数据的维数以及特征检测器(或滤波器)如何在数据之间滑动:

    “一维和二维卷积神经网络” 由 Nils Ackermann 在知识共享许可 CC BY-ND 4.0 下授权。

    问题描述

    在本文中,我们将专注于基于时间片的加速度传感器数据的处理,这些数据来自于用户的腰带式智能手机设备。基于 x、y 和 z 轴的加速度计数据,1D CNN 用来预测用户正在进行的活动类型(比如“步行”、“慢跑”或“站立”)。你可以在我的另外两篇文章中找到更多的信息 这里 和 这里。对于各种活动,在每个时间间隔上的数据看起来都与此类似。

    来自加速度计数据的时间序列样例

    如何在 PYTHON 中构造一个 1D CNN?

    目前已经有许多得标准 CNN 模型可用。我选择了 Keras 网站 上描述的一个模型,并对它进行了微调,以适应前面描述的问题。下面的图片对构建的模型进行一个高级概述。其中每一层都将会进一步加以解释。

    “一维卷积神经网络示例”由 Nils Ackermann 在知识共享许可 CC BY-ND 4.0 下授权。

    让我们先来看一下对应的 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 轴的三个数据。这样就得到了一个 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 层之后经常会使用池化层。在我们的示例中,我们选择了大小为 3 的池化层。这意味着这个层的输出矩阵的大小只有输入矩阵的三分之一。

    第三和第四个 1D CNN 层: 为了学习更高层次的特征,这里又使用了另外两个 1D CNN 层。这两层之后的输出矩阵是一个 2 x 160 的矩阵。

    平均值池化层: 多添加一个池化层,以进一步避免过拟合的发生。这次的池化不是取最大值,而是取神经网络中两个权重的平均值。输出矩阵的大小为 1 x 160 。每个特征检测器在神经网络的这一层中只剩下一个权重。

    Dropout 层: Dropout 层会随机地为网络中的神经元赋值零权重。由于我们选择了 0.5 的比率,则 50% 的神经元将会是零权重的。通过这种操作,网络对数据的微小变化的响应就不那么敏感了。因此,它能够进一步提高对不可见数据处理的准确性。这个层的输出仍然是一个 1 x 160 的矩阵。

    使用 Softmax 激活的全连接层: 最后一层将会把长度为 160 的向量降为长度为 6 的向量,因为我们有 6 个类别要进行预测(即 “慢跑”、“坐下”、“走路”、“站立”、“上楼”、“下楼”)。这里的维度下降是通过另一个矩阵乘法来完成的。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

    考虑到我们使用的是标准的 1D CNN 模型,得到这样的结果已经很好了。我们的模型在精度(precision)、召回率(recall)和 f1 值(f1-score)上的得分也很高。

    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

    下面对这些分数的含义做一个简要回顾:

    “预测和结果矩阵”由 Nils Ackermann 在知识共享 CC BY-ND 4.0 许可下授权。

    精确度(Accuracy): 正确预测的结果与所有预测的结果总和之比。即 ((TP + TN) / (TP + TN + FP + FN))

    精度(Precision): 当模型预测为正样本时,它是对的吗?所有的正确预测的正样本除以所有的正样本预测。即 (TP / (TP + FP))

    召回率(Recall): 为模型识别出的所有正样本中有多少是正确预测的正样本?正确预测的正样本除以所有的正样本预测。即 (TP / (TP + FN))

    F1值(F1-score): 是精度和召回率的加权平均值。即 (2 x recall x precision / (recall + precision))

    测试数据上对应的混淆矩阵如下所示。

    总结

    本文通过以智能手机的加速度计数据来预测用户的行为为例,绍了如何使用 1D CNN 来训练网络。完整的 Python 代码可以在 github 上找到。

    链接与引用

    Keras 文档 关于一维卷积神经网络部分

    Keras 用例 关于一维卷积神经网络部分

    一篇关于使用一维卷积神经网络进行自然语言处理的好 文章

    展开全文
  • (8)卷积神经网络如何处理一维时间序列数据? 概述 许多文章都关注于二维卷积神经网络(2D CNN)的使用,特别是图像识别。而一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的...
  • 一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来解决你可能正面临的一些机器学习问题。本文试图补上这样一个短板...
  • 概述许多文章都关注于二维卷积神经网络(2D CNN)的使用,特别是图像识别。而一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文...
  • 一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的应用。目前很少有文章能够提供关于如何构造一维卷积神经网络来一些机器学习问题。何时应用 1D CNN?CNN 可以很好地识别出数据中的...
  • 原文地址:Introduction to 1D Convolutional Neural Networks in Keras for Time Sequences 原文作者:Nils Ackermann 译文出自:掘金翻译计划 ...译者:haiyang-tju ...许多技术文章都关注于二维卷积...
  • 一维卷积神经网络处理序列问题的作用在计算机视觉中我们经常使用卷积神经网络,由于其能够自动提取图像特征,并且可以高效的处理数据。对于序列处理问题,我们可以将序列看成一维空间,也就是我们前面说的数据维度...
  • 使用一维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 神经网络对于一维数据非常重要,时序...希望给大家使用CNN处理一维数据一些帮助。 参考代码 # Implementing Different Layers...
  • 一维卷积神经网络处理序列问题的作用在计算机视觉中我们经常使用卷积神经网络,由于其能够自动提取图像特征,并且可以高效的处理数据。对于序列处理问题,我们可以将序列看成一维空间,也就是我们前面说的数据维度...
  • Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积,从图像像素中...
  • 在“卷积神经网络”中我们...其实,我们也可以将文本当作一维图像,从而可以用一维卷积神经网络来捕捉临近词之间的关联。TextCNN简介TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 《 Convolu...
  • 当你希望从整体数据集中较短的(固定长度,即kernal size)片段中获得感兴趣特征,并且该特性在该数据片段中的位置不具有高度相关性时,1D CNN 是非常有效的。1D CNN 可以很好地应用于传感器数据的时间序列分析(比如...
  • 小白也能看懂的TensorFlow上手系列作者 | Divyanshu Mishra编译 | VK来源 | Towards DataScience卷积神经网络种特殊的神经网络结构,是自动驾驶汽车、人脸识别系统等计算机视觉应用的基础,其中基本的矩阵乘法...
  • 基于卷积神经网络(二维)(视觉)对水果分类 今年的春天和去年格外相似,但要好于去年,研究生两年活生生过...二维卷积神经网络的原理和一维类似,只是将卷积核,卷积步长,池化核以及步长由一维增加到二维,卷积方向
  • CNN中最常见的就是二卷积层,它有高、宽两个维度,常用来处理图像数据。 二、互相关运算与卷积运算 1. 互相关运算 在二互相关运算中,个二输入数组XXX和个二维核KKK(kernel)数组进行互相关运算,输出...
  • 基于以上特点,我们把时间或者说文本的前后看做一个维度,那一段文本就是一个一维空间,相比图片的二维空间,变得更加简单了,那卷积神经网络是否可以处理这样的情况呢? 先亮出结论,答案是肯定的。图片是二维的...
  • 文章目录卷积神经网络意义案例演示数据...无法通过细枝末节的修补对其准确度做出更进一步的提高,因此本章开始放弃原有模型而采用全新的卷积神经网络数据进行处理。对于任意个卷积网络来说,几个必不可少的部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 402
精华内容 160
关键字:

卷积神经网络处理一维数据