首页 > 编程知识 正文

cnn卷积神经网络预测分类,一维cnn卷积

时间:2023-05-04 04:34:57 阅读:130215 作者:3876

介绍

许多文章集中在二维卷积神经网络上。 特别是用于图像识别的问题。 一维CNN复盖一定的范围,例如用于自然语言处理(NLP )。 虽然可能会遇到其他机器学习问题,但是很少文章会提供关于如何构建一维CNN的说明性练习。 我尝试了弥补这个差距。

什么时候应用一维CNN?

CNN可以用于清楚识别数据中的简单模式,并将其用于形成更高层次、更复杂的模式。 一维CNN在试图从整体数据集的短(固定长度)片段中获得有趣的特征且该特征在该片段中的位置无关时非常有效。

最适合分析陀螺仪和加速度计等传感器数据的时间序列。 它还适用于在一定长度的时间段内分析所有类型的信号数据,包括音频信号。 另一个应用是NLP。 (在这里,LSTM网络更有前景,但单词的邻近性可能不一定是可训练模式的好指示。

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

CNN在1D、2D、3D中都具有相同的特征,并采用相同的方法。 重要的区别在于输入数据的维度以及特征检测器(或过滤器)在数据上的滑动方式。

提问的陈述

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

如何用Python构建一维CNN?

有很多标准的CNN模型。 我选择了Keras网站上描述的模型之一,为了应对上述问题进行了一些修改。 下图概述了所构建的模型。 对各层进一步说明。

但是,让我们先看看Python代码,然后构建这个模型。

模型_ m=sequential ()

model _ m.add (reshape ((time _ periods,num_sensors ),input_shape=) input_shape,) )

model _ m.add (con v1d (100,10,activation='relu ',input_shape=(time_periods,num_sensors ) )

model _ m.add (con v1d (100,10,activation='relu ' ) )

model_m.add(maxpooling1d(3) )

model _ m.add (con v1d (160,10,activation='relu ' ) )

model _ m.add (con v1d (160,10,activation='relu ' ) )

model _ m.add (全局averagepooling 1d ()

model_m.add(dropout ) (0.5 ) ) ) ) )。

model_m.add(dense(num_classes,activation='softmax ' ) )

print(model_m.summary ) )

运行此代码将生成以下深度神经网络:

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _。

layer (类型) Output Shape Param #

=====================================

reshape_45(reshape ) None,80,3 ) 0

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _。

conV1D_145(conV1D ) )否,71,100 ) 3100

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _。

conV1D_146(conV1D ) ) None,62,100 ) 100100

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _。

最大轮询1d _ 39 (最大轮询(无,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

以下是这些分数的简要说明:

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

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

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

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

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

总结

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。