介绍
许多文章专注于二维卷积神经网络。 它们特别用于图像识别问题。 一维CNN涵盖了一定范围,例如 用于自然语言处理(NLP)。 尽管我们可能会遇到其他机器学习问题,但很少有文章提供有关如何构造一维CNN的解释性演练。 本文试图弥补这一差距。
何时应用一维CNN?
CNN可以很好地识别数据中的简单模式,然后将其用于在更高层中形成更复杂的模式。 当我们希望从整体数据集的较短(定长)片段中获得有趣的特征,并且该特征在该片段中的位置不相关时,一维CNN会非常有效。
这非常适用于分析传感器数据(例如陀螺仪或加速度计数据)的时间序列。 它还适用于在固定长度的时间段内分析任何种类的信号数据(例如音频信号)。 另一个应用是NLP(尽管在这里LSTM网络更有希望,因为单词的接近性可能并不总是可训练模式的良好指示)。
1D CNN和2D CNN有什么区别?
无论是1D,2D还是3D,CNN都具有相同的特征并采用相同的方法。 关键区别在于输入数据的维度以及特征检测器(或过滤器)如何在数据上滑动:
问题陈述
在本文中,我们将重点介绍时间分段的加速度传感器数据,这些数据来自用户腰间携带的智能手机。 根据x,y和z轴的加速度计数据,一维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.a