通过深度学习进行高频传感器故障检测和预测性维护
机器都会有故障和失灵。确定设备的状况或维护计划何时应该执行,是影响成本和生产力的极其战略性的决定。
机器学习方法已经成为一种很有前途的工具,在预测维修应用,以防止故障在生产线。然而,这些解决方案的性能取决于适当的数据分析和选择正确的分析方法。
在这篇文章中,我们面临着与之前其他相关文章一样的预测维护任务:使用CNN进行预测维护,使用CRNN进行预测维护。这里的特殊性在于,我们只使用一个单一的高频信号源来产生我们的最终预测。基于Mel-Frequency Cepstral Coefficients (MFCCs)的特殊变换是提取信号特征的基础。这一步使我们可以采用残差卷积神经网络结构,它学习我们数据的正确隐藏结构。
数据
我们的任务是研究压力条件下的液压管道。数据由UCI存储库收集(https://archive.ics.uci.edu/ml/datasets/Condition+monitoring+of+hydraulic+systems)。在液压系统的状态监测中,跟踪系统各部件的活动状态。
该数据集是在液压试验台上实验获得的。该试验台由主工作回路和二次冷却过滤回路通过油箱连接而成。当四个液压元件(冷却器、阀门、泵和蓄能器)的状态发生定量变化时,系统循环重复恒定的负载循环(持续60秒)并测量过程值,如压力、体积流量和温度。
更准确地说,我们关注于监控整个系统的状态(通过稳定标志标识为稳定或不稳定),分析电机功率。这个KPI由一个以100hz的采样率登记信号的单个传感器监控。
我们试图对时间序列切片进行分类,其形状类似于下图。
使用一阶差分对原始信号进行标准化,并对原始信号进行剪切以限制异常值。通过这种方式,标准化信号被用于生成MFCCs。
MFCCs通常衍生如下:
- 对原始信号进行傅里叶变换;
- 将上述光谱的幂次映射到mel-scale上;
- 对mel-log幂进行离散余弦变换;
- MFCCs是产生的光谱的振幅。
在音频分析中看到它们的应用很常见,但我们在这里利用它们处理高频数据的能力。
模型
如前所述,我们使用基于卷积的网络来预测液压管道的系统状态。我们在卷积块中加入一些使用剩余跳跃连接的捷径。
更深层次的网络更难优化。在网络中增加额外的层次,我们增加了训练过程的难度。对于我们的优化算法来说,使损失最小化变得更加困难。剩余结构试图通过添加跳过连接来解决此问题。跳过连接添加从网络中的一个初始点到转发点的映射。如果网络不能学习更多的东西,网络的权值将保持不变,否则,如果进行了改进(在损失或度量优化中),网络权值将随之改变。
下面是一个残差块的例子,我们可以很容易地在我们的网络架构中使用。此外,根据问题的需要,层的数量、激活函数或内核大小可能会有不同的变化。在使用这种块时,唯一必须不变的是它内部的维度。在我们的示例中,我们小心地在卷积操作中操作padding,并使初始维数等于操作最终连接的最新卷积层。
def residual_block(init, hidden_dim):
init = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(init)
x = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(init)
x = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(x)
x = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(x)
skip = Add()([x, init])
return skip
我们将我们的方法与一个假基线进行比较,假基线包含我们的测试样本总是属于测试数据中的大多数类(稳定条件)。我们的网络在不可见测试数据上达到87%的精度。这是一个很好的结果,与我们的基准相比有了很大的改进,基准的精确度为66%。
总结
在这篇文章中,我们执行了一项预测性维护任务。更详细地预测了仅考虑发动机功率的液压试验台的一般情况。考虑的信号具有高频特征,这就不可避免地要对我们的数据进行一些初步的处理。通过基于MFCC的特征提取过程,生成有价值的信息。产生的新信号被用于提供一个基于剩余连接的深度学习模型,从而产生最终的预测。
本文完整代码:https://github.com/cerlymarco/MEDIUM_NoteBook/tree/master/Predictive_Maintenance_ResNet
作者:Marco Cerliani
deephub翻译组
DeepHub
微信号 : deephub-imba
- 数据结构C#版笔记--单链表(LinkList)
- 操作系统 页式存储 页与块之间的关系详解
- 数据结构C#版笔记--双向链表(DbLinkList)
- 斐波那契数列与IE9
- DateTime.ToString()输出"年/月/日 时:分:秒"的格式
- Flash在线拍摄用户头象
- win7 64位下如何折腾Tubro C 3.0
- TweenLite的又一应用:图片的拼图加载效果
- mysql创建数据表时如何判断是否已经存在?
- 温故知新:接口的隐式实现与显式实现
- 也谈枚举ToString()性能的改进
- silverlight:利用telerik中的zip类对字符串进行压缩、解压
- 索引,视图,存储过程和触发器文档
- 重点解读:用小程序给公众号涨粉10w的7大行业案例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 每日一题 | 土豪割草问题
- 高阶面试:伯努利过程
- Python 分析电影《南方车站的聚会》
- Python 基础(十八):命名空间 & 作用域
- Python爬虫(三):BeautifulSoup库
- Python 爬虫(四):Selenium 框架
- Python 爬虫(五):PyQuery 框架
- Python 爬虫(六):Scrapy 爬取景区信息
- Python 爬虫(七):pyspider 使用
- 你的童年有俄罗斯方块吗?教你用 Python 实现俄罗斯方块!
- Python 基础(七):字典与集合
- 5 分钟教你用 Python 实现贪吃蛇!
- Python 基础(八):与时间相关的模块
- 用 Python 实现一场环保无污染的烟花秀
- Python 基础(九):函数