风机桨叶故障诊断(六) 利用自编码器进行特征学习

风机桨叶故障诊断(六) 利用自编码器进行特征学习


     在之前的工作中,我已经初步构建了三层的BP神经网络,并已经从样本集的选取,模型的选择(隐含层神经元个数),和输出层神经元阈值选择这几个方面对桨叶的识别问题进行了优化。也得到了一些有用的结论:

     1.我们的算法需要更多的数据,更多的数据对于提高算法的表现是有效的。

     2.通过人为的控制神经网络输出层阈值可以降低误识率(以增大漏识率为代价)。

     3.隐含层神经元个数选在25-100之间是最好的,更多的是无意义的反而会更糟,因为算法处于过拟合状态(换句话说还是缺少样本)。

     通过以上分析,我们已经知道了哪些努力可以提升算法的表现。但是当前这个项目还处于在实验室测试算法的阶段,样本的问题目前是无法获取更多了,阈值我们也已通过实验选取了较为合理的数值。那么当前我们还能做些什么,来本质上的优化我们的算法,再之后再配合上更为好的样本集的选取,以达到理想的识别效果呢?

     特征提取!!!

     我思考了许久,发现我们漏掉了一个提升算法的重要途径,进行更好的特征提取。我之前完全默认在了对于图像识别的特征选择的一般方法中了,也就是选取图像的所有像素点的取值作为输入特征。虽然这是最普遍的做法,但是我们完全可以对原图像进行特征提取,用更具代表性的输入来训练我们的神经网络,下面就是思考如何进行特征提取了。

     首先想到的便是边缘提取,用边缘像素信息代替原图像像素信息。不过我担心边缘提取后桨叶的信息只剩下两条线,很可能受到识别现场输电线的干扰。而且我们的算法目前已经处于过拟合状态,能够胜任较复杂的识别任务,只是还没提供足够的样本,所以边缘提取后损失大量的像素信息结果也许并不理想。(所有出现在我系列博文中的结论均是在得到实验的结果后给出的,但是这段我单独说明一下,只是我的猜测。相当于我在算法的优化上走到了一条多岔路口,有很多选择,我分析这条路可能走不长久,便选了另一条路,幸运的是恰巧得到了很好的结果,所以就没有再回过头来验证了我的这个想法对不对了)。

     没有用边缘提取进行特征的提取,我想到的是一种自学习特征的方法。前些日子在看Andrew Ng的关于深度学习的教程的过程中,接触到了一个叫自编码器或自编码神经网络的算法。利用它可以很好的自我学习特征,我将它在深度学习中的一点点思想挪用到了我的算法中,取得了蛮不错的效果。下面来介绍下自编码神经网络:

     自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如 \textstyle y^{(i)} = x^{(i)} 。也就是说,自编码神经网络与我们最熟悉的BP的区别仅仅在于它是个无监督学习算法,其实就是将输出设为与输入相同,传播算法与传递函数(本问题选sigmoid函数即可)均是一样的。下图是一个自编码神经网络的拓扑结构示例(图片来自Andrew Ng教程)。

     

     编码神经网络尝试学习一个 \textstyle h_{W,b}(x) \approx x 的函数。换句话说,它尝试逼近一个恒等函数,从而使得输出 \textstyle \hat{x} 接近于输入 \textstyle x 。恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构。举例来说,假设某个自编码神经网络的输入 \textstyle x 是一张 \textstyle 10 \times 10 图像(共100个像素)的像素灰度值,于是 \textstyle n=100 ,隐藏层 \textstyle L_2 中有50个隐藏神经元。它必须从50维的隐藏神经元激活度向量 \textstyle a^{(2)} \in \Re^{50} 中重构出100维的像素灰度值输入 \textstyle x 。如果输入数据中隐含着一些特定的结构,比如某些输入特征是彼此相关的,那么这一算法就可以发现输入数据中的这些相关性。

    既然自编码器可以从一些相关的输入中发现其隐含着的特定结构并提取出来,我就想到用自编码神经网络为我们进行特征提取,对图像像素值输入进行提取。注意我们由自编码器的特点可以看出,让它从具有特定结构的输入中提取才是有意义的。所以我的做法是,把正样本集和负样本集分别放入自编码器进行训练(注意是分别训练)。

    然后我们对于某一个样本集(比如正样本集)训练完的结果,利用训练得到的模型参数 \textstyle W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)}(分别代表隐含层到输入层连接权重矩阵,偏置神经元连接权重向量;输出层到隐含层连接权重矩阵,偏置神经元连接权重向量,给定任意的输入数据 \textstyle x,可以计算隐藏单元的激活量(activations) \textstyle a。如前所述,相比原始输入 \textstyle x 来说,\textstyle a 可能是一个更好的特征描述。下图的神经网络描述了特征(激活量 \textstyle a)的计算。

    

     这实际上就是之前得到的稀疏自编码器,在这里去掉了最后一层。对于负样本集我们可以同样的训练完后去掉最后一层。我们是分着进行训练的,这样做相当于分别为正样本和负样本找到了更好的特征描述。然后我们可以将得到的结果进行整合,也就是将得到的权重矩阵合并到一起,这样没有改变任何东西,只是相当于两个神经网络整合成了一个,同时拥有了对正负样本更好的特征表达。按照我的理解,当我们输入一个正样本时,用来训练正样本得到的那些隐含层神经元会表现的比较活跃,因为它们看到了熟悉的结构熟悉的小伙伴!~反过来负样本是同理的,我认为这是自编码器能够发挥很好效果的所在。在实践中,我正负样本集上分别各训练了含50个神经元的自编码神经网络,然后将其合在了一起。这样,每当我得到了一幅图片,我可以将其变换为一个100维的输入向量,并且这个向量对于计算机来说是更好的特征表达。对于所有的样本都做相同的处理,得到了新的特征提取后的样本集。最后一步就是将新的样本集输入我们原来的算法进行训练,我们来期待一下效果!

    首先算法随机展示了100个样本,显然人眼已经完全看不出图像原来的内容和轮廓,但是我们可以明显的将样本分为两类,这说明了我们的自编码器很好的提取了计算机看起来更好的特征,如下图所示:

         

    然后开始训练,最大迭代次数设置为1000次。最后的输出结果如下:

-----------------------------------------------------------------------------

Iteration   998 | Cost: 7.793451e-01
Iteration   999 | Cost: 7.793416e-01
Iteration  1000 | Cost: 7.793044e-01

Program paused. Press enter to continue.

Visualizing Neural Network... 

Program paused. Press enter to continue.

Training Set Accuracy: 86.571429
Test Set Accuracy: 80.402010

发生假阳性错误的概率(把一个负样本估计成正样本的概率): 0.000000
真阳性的概率(把一个正样本估计成正样本的概率): 38.095238

-----------------------------------------------------------------------------

    对比之前没有进行特征提取的结果,算法在训练样本集上的准确率有所下降(之前在90%偏上浮动),在测试样本集上准确率明显上升(之前的70%-75%)。这说明我们的算法对于输入特性的更好的理解也一定程度解决了算法过拟合的问题,这确实是意外收获!此外,我们之前说过,对于我们的具体问题,我们最关心的是发生假阳性错误的概率能否很低,而对正样本的识别率可以放宽。优于神经网络每次输出结果都会有差异,为了结果的可靠性,我都是采用多次训练并记录结果。我找出了之前记录的算法的表现记录,列出如下表格进行对比:

普通BP神经网络训练结果图像进行特征提取后的BP神经网络训练结果
假阳性错误的概率真阳性概率假阳性错误的概率真阳性概率
3.51758814.070352038.095238
4.02010119.597992.06896638.888889
4.52261321.608042.91970848.387097
5.02512614.0703521.4184439.655172
4.52261319.0954770.67567641.176471

    由结果可以看出,由于算法对于输入有了更好的认识,假阳性错误的概率进一步的降低,并且已经到了可以接受的范围内了。同时正样本的识别率也明显的上升了,这也就给了我们通过修改输出层阈值来减小假阳性错误的概率更大的空间(尽管已经很满意了),因为正样本的识别率已经远超我们的预期要求了。

    今天就到这里了,改进后的算法表现真的大超我的预期,真是太兴奋了!今天进展很大,收获很大,加油↖(^ω^)↗



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS

风机桨叶故障诊断(七)滑动窗与非极大值一直NMS 到目前为止,我已经利用自编码神经网络提取特征后训练得到了BP神经网络(参见:点击打开链接),且在测试样本集上表现不错。下面我们就要应用到实际中…

Distinctive Image Features from Scale-Invariant Keypoints-SIFT算法译文

本文全篇转载自如下博客,感谢博主的无私分享 http://www.cnblogs.com/cuteshongshong/archive/2012/05/25/2506374.html ------------------------------------------------------------------------------------------------------ 从尺度不变的关键点选择可区分的…

将图像绘制成3维立体散点图

matlab源代码: Iimread(F:\绝缘子识别\绝缘子红外test图片\test (50).jpg); Irgb2gray(I); [wd,len]size(I); interval10; %设置绘制散点图的间隔,全部绘出会很卡 x[]; y[]; z[]; numfloor((len-1)/interval)1;%计算在当前间隔下图像的每一行…

二叉树的非递归遍历|前中后序遍历

二叉树的非递归遍历 文章目录 二叉树的非递归遍历前序遍历-栈层序遍历-队列中序遍历-栈后序遍历-栈 前序遍历-栈 首先我们应该创建一个Stack 用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入S…

C#灰度图转伪彩色图

/// <summary>/// 伪彩色图像构造器/// </summary>public class PseudoColorImageBuilder{/// <summary>/// 铁红色带映射表/// 每一行代表一个彩色分类&#xff0c;存放顺序是RGB/// </summary>public static byte[,] ironTable new byte[128, 3] {{…

砥志研思SVM(二) 拉格朗日乘子法与KKT条件

[1]最优化问题中的对偶性理论 [2]拉格朗日乘子法(上) [3]拉格朗日乘子法(下)

VS2015上配置opencv2.4.11

VS2015上配置opencv2.4.11版方法总结 最近给电脑重装了系统&#xff0c;需要的软件各种装。今天阅读了很多网上的博客&#xff0c;几经波折完成了opencv的配置。配置opencv与其他函数包或者软件相比算是麻烦的了&#xff0c;可能出现的问题也是五花八门&#xff0c;所以针对我的…

热传导方程的差分格式原理与matlab实现

function [ ] ParabolicEquation( h,k ) %求解抛物型方程中的一种&#xff1a;热传导方程 %h:x轴步长 %k:t轴步长rk/(h*h);%网格比 Mxfloor(1.0/h)1;%网格在x轴上的节点个数&#xff08;算上0&#xff09; Ntfloor(1.0/k)1;%网格在t轴上的节点个数&#xff08;算上0&#xff…

如何开发一个扫雷小游戏?

如何用C#开发一个扫雷小游戏&#xff1f; 十分自豪的说&#xff0c;计算机编程就是变魔术&#xff0c;每一个coder都是一个魔术师。 初学C#的时候&#xff0c;我相信很多人都和我一样&#xff0c;学会了基本语法&#xff0c;掌握了基本的数据结构&#xff0c;也见过了不少微软…

在emIDE中创建STM32项目

&#xfeff;emIDE是一个开源的嵌入式集成开发环境&#xff0c;基于Code::Blocks开发&#xff0c;能够支持多个平台和多个厂家的嵌入式硬件&#xff0c;继承了Code::Blocks的优点。 下载emIDE并安装&#xff0c;也可选择绿色版。若需要调试则需安装J-Link GDB Server。 1、打…

“Hello,Github!——如何配置并上传一个已有项目到Git上

“Hello&#xff0c;Github!"——如何配置并上传一个已有项目到Git上注意&#xff01;前言十分简短&#xff01;如今&#xff0c;Github已经成为了管理软件开发以及发现别人优秀代码的首选方法。所以还在等什么&#xff01;快点跟上脚步&#xff01;今天初次注册了Github账…

使用EmBitz开发STM32项目开发环境配置

&#xfeff;&#xfeff; 一、EmBitz软件获取与安装 1、EmBitz软件的获取 EmBitz原名Em::Blocks&#xff0c;是基于Code::Blocks开发的&#xff0c;面向嵌入式的C/C集成开发环境。支持J-Link和ST-Link调试器。使用J-Link仿真器时需安装J-Link GDB Server。 EmBitz下载地址&…

Python格式化输出方法

Python格式化输出 本文转自&#xff1a;Python格式化输出 今天写程序又记不清格式化输出细节了…… 索性整理一下。 python print格式化输出。 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果&#xff1a; 2.打印整数 print ("He is %d yea…

基于STM32和W5500的Modbus TCP通讯

&#xfeff;&#xfeff; 在最近的一个项目中需要实现Modbus TCP通讯&#xff0c;而选用的硬件平台则是STM32F103和W5500&#xff0c;软件平台则选用IAR EWAR6.4来实现。 1、移植前的准备工作 为了实现Modbus TCP通讯首先需要下载W5500的驱动源码&#xff0c;可以到WIZnet的…