深度学习与西储大学轴承数据集(二)

西储大学数据的处理其实不复杂,在网上用心搜索的话可以找到几个版本,但是在实际使用过程中多少都还会遇到一些问题。事实上,实现数据集的基础功能比较容易,但是如果在使用过程中有一些细节注意不到的话,很可能你后续的实验会白做,这里我也走过一些弯路。大致来说,数据集制作一步到位比较难,因为后续你可能要在多种情况下应用,比如说加噪声、做FFT、维度变换、小波变换、选小样本进行迁移学习等。如果数据集搞不好,可能你的结果就不受控,到时候排查起问题来特别麻烦。

对于数据集的处理,我这里把它分为3个部分详细进行说明。

  • 数据的读取

  • 数据的分割组合

  • 数据的变换

一、数据的读取

数据的读取是第一步,虽然文件的格式是mat,但是用matlab处理其实没有必要。我们直接用python自带的读取函数就可以,以最常见的10分类为例,即取工况1中,1个正常文件,3种尺寸的3种故障。这里很多人直接把1类文件放到一个文件夹里,我的则是分的更细些,把不同分类也用文件夹分开,如图所示。

深度学习与西储大学轴承数据集(二)_第1张图片

三种工况

深度学习与西储大学轴承数据集(二)_第2张图片

10种分类(也可以不分文件夹)

def readmat(path, label,name="_DE_time",steps=128):
    datalist = []
    mat_filename_list = os.listdir(path) #得到文件夹下的所有文件名称
    mat_filename_list.sort(key=lambda x: int(x[:-4])) #文件名排序
    for mat_filename in mat_filename_list:
        matdata = scio.loadmat(path + mat_filename) #读取文件
        data_name = "X" + mat_filename[0:3] + name  #提取所需的传感器数据
        data = matdata[data_name] #提取所需的传感器数据
        datalist.append(data)   #将数据整合至列表

我这里的代码是为了说明问题,并不完整,大家最好还是理解以后自行进行补全。

其实读取文件形成列表这一步大家都差不多,我这里在函数里增加了选项,可选DE或FE,可以用于后续做迁移学习。steps后续用来滑窗取值的参数,这里请大家先行自动忽略。

二、数据的分割组合

数据的分割组合是最重要的一个环节,在数据的划分比例上,也很难有统一的标准。这里一共有几个问题必须事先搞清楚。

  1. 取多大的窗口?

  2. 划分训练集、测试集还是训练集、验证集、测试集?

  3. 各个数据集合的比例怎么定?

  4. 要不要做滑窗取值?

首先我贴一张图,图里是我统计的个人看过的论文里的数据集划分方法,仅供参考。

深度学习与西储大学轴承数据集(二)_第3张图片

数据集划分参考

上面的数据来源至少都是近几年中文核心,也有SCI、书籍、博士的研究,应该还算是比较有参考意义的。但是我们不难发现,大家虽然用的是同一个数据集,但划分方法咋就这么不一样呢?

  1. 首先从分类讲,建议大家直接用10分类,因为4分类的指标普遍都太好了,做的人确实也较少,实际操作起来也不会简单多少,所以真的没这个必要。更何况从工程意义上讲,区分故障种类的同时我们肯定更希望知道故障的大致严重程度。

  2. 输入数据的类型上就见仁见智了,令我没想到的是居然时域的分析比较多。时域分析的好处就是处理起来简单一些,缺点就是效果差一些(我自己测的),对噪声的鲁棒性差一些(也是我自己测的),大家可以自己试试。频域数据作为输入的在论文里我还没看到,这里统计的是在一本教材里看到的,作者是这个领域的博士,我觉得挺靠谱,自己也就借鉴了他的方法。频域数据的好处就是提取了频域信息,特征明显。毕竟是研究信号嘛,还是频域图更加直观,传统的方法里故障频率可是至关重要的指标。确定是丢失了时间特征,目前我感觉时间特征其实不是很关键,因为训练前大家都要随机排列样本的,而每一小段样本里的时间信息确实太少了,恐怕也难以说明问题;时频图作为输入的最近几年不少,就是通过小波变换或者短时傅里叶变换形成时频图,将图片作为输入。好处就是既保留了时域信息,也提取了频域特征。而图片的输入形式,天然适配各种成熟的图片处理网络模型,做起实验来省点事。缺点就是尺寸有点大,对我来说自己的笔记本电脑肯定跑不动,效果好不好我也没试过,理论上应该是不错的。再多说一句,数据类型的选择很重要,没有绝对的优劣,但是你可能都得试试。

  3. 样本的长度上花样就没那么多了。选择的时候大家要注意的就是轴承的自转周期,大概不到400个点是1圈,所以最好以它的整数倍取值,这是信号本身的周期性决定的。破坏这种周期性不利于分析,也是没有必要的。上面的图里2048用的人比较多,大概5个周期。做FFT的话变成1024个点,再二维变换正好是32×32输入2D卷积网络,这是我的处理办法。1024的感觉也行,2个半周期,不会很差,我一开始这么分过,可以直接二维变换为32×32输入。但是做FFT就尴尬了,512就不好变换了。其它样本尺寸不推荐,时频图输入那两个我记得也是2048个点为一个样本的。不过居然还有论文不交代自己样本大小的,我也真是无语,以后这种基本条件都不交代的论文还是少看,实在是没法参考。

  4. 数据集的划分是个重点。这里有两个问题,一是要不要验证集,二是比例怎么定。这几个案例里也是各种都有。我的观点是验证集是必须的,你也可以在制作数据集时不用验证集,在model.fit时再用自带的参数从训练集里划分出来,但是论文里是要交代清楚的。有一些萌新可能嫌麻烦,在训练时直接把测试集当验证集用的,这明显是有问题的,相当于作弊吧,具体大家可以查查相关文章。我初期的实验就是这么搞的,效果当然不错,毕竟是提前看到了答案啊。。。还有人可能说,我就不要验证集了,我直接用训练的loss作为标准。这样程度上没有瑕疵,不过最终效果可就差多了。关于划分比例上其实不必太纠结,写函数的时候做成可调的差不多就行。我用的是7:1.5:1.5,参考的是教材里的,谁叫这是我看的第一本书呢,而且我觉得人家博士研究的肯定比我透彻,我也希望用相同的数据集划分方式,和博士的实验数据做对比。

  5. 滑窗到底需不需要呢。如果大家有点经验,就能从上面看出来大部分的是做过滑窗的,而且数据集都扩充了10倍左右。有些是训练集、验证集和测试集都做了滑窗,有些没有在测试集上做处理。滑窗作为少数的时序数据增强方法还是很有必要的,在图像处理领域,翻转、平移等数据增强手段都已经是常规操作了,所以我个人认为滑窗也应该是一种常规操作。从效果上看,滑动取值的方法也确实更好。

本来打算在这一部分多写程序的,没想到还是一堆文字。没办法,需要说清楚的问题太多了,不然没法直接上程序啊。程序还是下一节再说吧,今天只能写到这里了,希望大家多多支持点赞,如能留言交流,不甚荣幸!

你可能感兴趣的:(故障诊断,深度学习,python,机器学习)