首先,小编这里花费了两周多的时间,从数据集到网络的搭建,都是小编亲手完成的,在这里想把整个过程分享给大家,希望大家可以从中学到东西,那么话不多说,开始介绍我的心酸之旅.
首先我是使用了 WISDM (Wireless Sensor Data Mining) Lab 实验室公开的 Actitracker 的数据集,在此数据集上进行数据清洗,制作出小编自己的数据集.对于这个数据集,大家可以自己去下载,接下来,小编将告诉大家,数据处理的重要性,以及如何对数据进行处理
在现有的公开数据集中,许多数据集中的数据都是有错误的,比如说在数据集中会出现没有采集到的数据,以及有些数据是残缺的,是错误的,在WISDM中,数据存在以下几个缺陷:1,数据分布不均匀,2,出现极少数数据是错误的情况,这些都会使我们在使用数据集训练网络的时候出现各种各样的错误,所以必要的数据清洗还是十分重要的,当然,有些同学的机器也带不动如此大量的数据(WISDM总共有1080000多条数据),那么对于数据的处理就十分的有必要了.
在这里,小编给大家推荐两个工具,一个就是python,我们的所有代码都是用python写的,另一个就是shell脚本,说实话,小编认为,在linux下进行深度学习是真的很方便,因为shell脚本的存在可以使数据处理变得十分的简单,小编推荐,python和shell脚本混合使用,效果会很好.
小编这里是这样处理数据的,通过观察WISDM数据集,小编发现,整个数据集由36个人组成,每个人会做6个动作,这6个动作分别是Walking,Jogging,Upstairs,Downstairs,Sitting,Standing.然后数据的选取就是在做动作的整个时间段里,按照一定采样频率对被测试人进行采样,从而得出了整体数据,那么问题就来了,我们可以发现这个数据有一个特点,就是时效性,也就是说数据和数据之间有时间上的关系,所以,在我们进行数据抽取的时候,一定要注意,要抽取一段连续的数据,一定不能随机抽取数据,小编这里是这样抽取数据的,首先选取20个人作为训练集,选取2个人为测试集,然后每个人的每个动作抽取连续的500条数据,那么一个人就应该是500*6条数据,那么训练集的大小就是500*6*20条数据,测试集是一样的,然后给大家介绍,如何使用工具去抽取数据
在这里我们就拿小编刚说的进行抽取,那么我们第一步要做的就是将训练集制作出来.
1,使用python进行处理
在拿到数据集的时候,他们是长成这个样子的
大家可以看见很多的逗号,分号一类的,我们要做的就是去掉他们,这里我们可以使用python来做(这里的代码只是告诉大家如何去处理,不能直接运行)
import os
a = open("这里写你自己的数据集所在的位置",'r+')
for i in range(这里写你的数据总共有多少条):
b = a.readline()#将每一条数据读成一个字符串
c = b.replace(","," ")#将所有的逗号换成空格
d = c.replace(";","")#将所有的分号换成什么都没有
a.write(d)
现在去掉以后我们现在就可以利用shell抽取数据了,请看代码段
awk '{if ($1==1&&$2=="Standing") print }' data.txt | head -500 >> temp.txt
#关于awk的使用大家可以去自己查,这里的意思就是,将编号为1的人的Standing动作抽取前500条,并且以追加的方式放入另外一个文件中,那么其他的人和动作如何处理我相信大家应该理解了,其实告诉大家,这里用一个循环,就可以搞定所有的人了
然后我们现在抽取完成了,此时的文件中,数据应该是长成这个样子
并且总共有500*6*20条数据,但是现在的数据还是不能使用啊,我们最后要用的是最后三列,那么同样我们使用shell进行处理
awk '{print $4 $5 $6}' temp.txt >> Train.txt
#将刚才我们看到的数据的最后三列提取出来,放进一个文件里
然后我们在看此时的数据样子
也就是这个样子,那么此时我们离成功已经不远了,无论是训练集还是测试集,我们都要处理成这个样子,然后我们可以想一下,既然我们要使用CNN网络,那么我们的输入就需要改一改,众所周知,cnn处理图像是很厉害的,那么我们就将这些数据处理的像图片一样,因为在cnn中,图片最终会以矩阵的形式放入网络,那么我们可以这样想,我们将x,y,z三个轴看做图片的RGB三通道,然后我们将数据一字排开,就会得到一个一行n列的一个向量,emm,但是为了方便起见,我们将这个n进行分解,也是就是说,我们每100组数据组成一个所谓的图片,也就是1*100*3就代表一个所谓的图片,这样我们就可以使用cnn,当然如果我们将输入进行了修改,那么,对于标签文件我们也要做相应的修改,在修改之前,我们是每一条数据都会有一个标签,但是我们修改后,只需要让每100条数据输出一个标签就好,对于如何处理标签文件,也是利用shell进行处理,最后我们将标签文件中的六个动作换成1到6的编号,此时我们的标签文件就做好了,请看下图这就是我们做好的标签文件
但是这样送入网络的话还是有问题的,TensorFlow提供给我们了一个函数,也就是将标签转化为onehot型的数据,接下来请看代码
a = np.loadtxt("这里写的是你的标签所在文件位置")#利用numpy读取文件
b = tf.one_hot(a,6)#将数据转化为onehot型
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
c = sess.run(b)
np.savetxt("这里写的是你要将结果存入的文件位置",c,fmt='%1.e')
print(c)
然后给大家看一下处理后的效果
其实就是把一个数字变成一个1*6的向量,原来的数字是几,那么第几列就为1
知道现在我们已经把训练集和测试集都已经处理完毕了,下一节我讲给大家展示如何搭建一个cnn,用来实现人体行为识别.
代码就在github上,有兴趣的同学可以去看看https://github.com/Amyassient/Human-behavior-recognition