许多文章关注二维卷积神经网络。它们特别用于图像识别问题。1D CNN在一定程度上被涵盖,例如用于自然语言处理(NLP)。很少有文章解释如何构建一个1D CNN。本文试图弥补这一差距。
CNN可以很好地识别数据中的简单模式,然后使用这些模式在更高的层中形成更复杂的模式。当您希望从整体数据集的较短(固定长度)片段中获得有趣的特征,且特征在片段中的位置相关性不高时,1D CNN非常有效。
这适用于传感器数据(如陀螺仪或加速度计数据)的时间序列分析。它还适用于分析固定长度周期内的任何类型的信号数据(如音频信号)。另一个应用程序是NLP(尽管在这里LSTM网络更有前途,因为单词的接近程度可能并不总是一个可训练模式的良好指示器)
无论是1D、2D还是3D, CNN都有相同的特点,采用相同的方法。关键的区别是输入数据的维度以及特征检测器(或过滤器)如何在数据中滑动:
在本文中,我们将重点关注加速度传感器采集的时间序列数据,数据地址为:https://www.cis.fordham.edu/wisdm/dataset.php。这些数据来自用户腰部携带的智能手机。基于x、y和z轴的加速度计数据,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
让我们深入每一层,看看发生了什么:
下面是训练模型的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模型之一。我们的模型在精确度、召回率和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
与测试数据相关联的混淆矩阵如下所示。
一维卷积神经网络的Keras文档
Keras的一维卷积神经网络的例子
一篇介绍一维cnn自然语言处理问题的好文章