风机桨叶故障诊断(三) 识别桨叶——初步构建BP神经网络

风机桨叶故障诊断(三) 

                                              识别桨叶——初步构建BP神经网络

     新的一天,希望有好的运气。今天开始着手系统的第一个模块,从一幅图像中寻找到桨叶所在的位置。第一直觉我们的识别任务属于难度比较大,干扰因素多的了,所以我没有考虑先试一下Logistic回归之类的相对简单的算法,我准备先简单抽选一些样本,直接用BP神经网络模型快速实现一下,然后再观察我们的算法问题所在,逐步进行完善,包括修改模型,增加样本数量等等。说干就干!

     之前我们已经得到了可以用来提取样本的风机图像库,我手动的从里面截取了一些样本,数了一下,正样本49个,负样本28个。然后将这些大小不一的正负样本统一缩放成20×20像素的小图像,下图所示的就是正样本最后处理完的结果:


     准备工作结束后,开始动手编写一个最简单的三层BP神经网络了。

     我们的输入是我们归一化后的20×20的图像,所以输入层的神经元个数为400。隐含层的神经元个数我最初选取的是25,输出层我选择的节点个数为2。用[1 0]代表正样本的期望输出,[0 1]代表负样本的期望输出。

     具体实现我是参考的coursera上吴恩达老师的机器学习课程上的代码,那个神经网络的示例代码是用来训练手写体数字识别的,是个多分类问题。由于我是在那份代码上简单修改来的,所以这也是为什么我的输出层有两个神经元而不是一个的原因,我把问题看成了一个多分类问题。

     经过了一上午的coding后,成功运行了。由于每次训练的结果都会不同,我多次运行并观察,训练样本的预测准确率在90%以上,测试集上的预测准确率在80%左右。看起来初步的结果还可以,不过我只有17个测试样本,再加上都是我手动选取的,有一定的主观因素,80%的准确率水分还是很大的。我们的初步实现的目的就是发现我们这个识别任务的难点,问题所在,只停留在得到一个准确率的数字是不行的,所以我意识到应该想办法要做一些误差分析。

     让我们来看一下我们的算法都有哪些问题,到底将测试样本中的哪些类型的图像预测错误了,也就是算法在哪类物体上表现不好。于是我着手写了下面的函数,需要提供测试样本集矩阵(每一行=一个20×20图像展开后形成的向量),以及表示每个样本是否被预测正确(用0和1表示)的数组,再提供一个可视化时每个样本图像边长显示多少的参数,matlab代码如下:

function [ h, display_array ] = DisplayErrorTestExample( X, example_width,errorIndex )
%显示所有测试集并标记出有错误的测试集
%errorIndex标识测试集每个样本的预测是否有误,有误用1,正确用0表示% Set example_width automatically if not passed in
if ~exist('example_width', 'var') || isempty(example_width) example_width = round(sqrt(size(X, 2)));
end% Gray Image
colormap(gray);% Compute rows, cols
[m n] = size(X);
example_height = (n / example_width);% Compute number of items to display
display_rows = floor(sqrt(m));
display_cols = ceil(m / display_rows);% Between images padding
pad = 1;% Setup blank display
display_array = ones(pad + display_rows * (example_height + pad), ...pad + display_cols * (example_width + pad));% Copy each example into a patch on the display array
curr_ex = 1;
for j = 1:display_rowsfor i = 1:display_colsif curr_ex > m, break; end% Copy the patch% Get the max value of the patchmax_val = max(abs(X(curr_ex, :)));display_array(pad + (j - 1) * (example_height + pad) + (1:example_height), ...pad + (i - 1) * (example_width + pad) + (1:example_width)) = ...reshape(X(curr_ex, :), example_height, example_width) / max_val;%如果是错误的测试样本,标红框if errorIndex(curr_ex)==1display_array(pad + (j - 1) * (example_height + pad) , pad + (i - 1) * (example_width + pad) + (0:example_width+1))=zeros(1,example_width+2);display_array(pad + j  * (example_height + pad) , pad + (i - 1) * (example_width + pad) + (0:example_width+1))=zeros(1,example_width+2);display_array(pad + (j - 1) * (example_height + pad) + (0:example_height+1), pad + (i - 1) * (example_width + pad) ) = zeros(example_height+2,1);display_array(pad + (j - 1) * (example_height + pad) + (0:example_height+1), pad + i * (example_width + pad) ) = zeros(example_height+2,1);endcurr_ex = curr_ex + 1;endif curr_ex > m, break; end
end% Display Image
h = imagesc(display_array, [-1 1]);% Do not show axis
axis image offdrawnow;end

     将上面的方法添加到写好的代码中,重新运行,其中两次的结果如下(图像显示的是仅有的17个测试样本,被黑框圈起的是预测错误的样本):


     可以看到,算法在负样本的预测中错误较多,我感觉这一方面与本身负样本就较少,一方面与负样本间差异很大,造成算法学习起来困难。我们重新思考下我们的系统,我们第一步是要从图像中识别出桨叶,如果识别错了,就会将不是桨叶的物体认为成桨叶进行下一步的故障诊断,那结果将是不能接受的。相反,如果我们对于一幅风机图像中的三个桨叶没有完全识别出来,却是无关紧要的,因为我们能在视频短时间的几帧之内获取到数张同一风机的图片,对于同一桨叶的识别我们有很多次的机会,所以我们算法对于正样本的漏识率可以相对较高,因为最终的识别率还是很高。

     所以可以看出,对于负样本的错误预测,也就是假阳性的概率,是必须要降低的。先从算法入手,或许我们可以通过修改神经网络输出时的判断阈值,也就是只有极有把握输入为正样本时,才判为正样本,否则均判为负样本。这样做也就是人为选择牺牲了识别率,降低了误识率。一切想法的好坏以实际说话,马上修改代码重新运行,其中两次结果如下:


     可以看到,出现假阳性的概率明显下降,同时漏识率比较明显的上升了,不过这是我们愿意看到的现象。说明这点改进对于算法的提升显著,后面算法的不断完善中也应当保留这种思想。

     今天就到这里了,忙了一天,今天的进展着实不小。总结一下,首先简单的选取了少量的样本并进行样本归一化,这样就得到了可供训练的训练集和测试集。然后训练了400×25×2的三层BP神经网络,最后对最初步的模型进行了误差分析并找到了一种效果显著的提升方法!

 

     


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

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

相关文章

风机桨叶故障诊断(四) 正负样本准备——从图像中随机扣图

风机桨叶故障诊断(四) 正负样本准备——从图像中随机扣图 在之前的工作中,我们已经训练了一个400252的三层BP神经网络,通过这个基础的神经网络进行了误差分析,对我们的问题有了更深刻的认识。现在我们要开始不断完善我…

风机桨叶故障诊断(五) 修改隐含层神经元个数的尝试

风机桨叶故障诊断(五) 修改隐含层神经元个数的尝试 我们已经为训练一个更为稳健的神经网络做好了样本的准备工作,那么我们开始下一步的工作吧! 我们已经有了样本集,目前我筛选出来了247个正样本,652个负样本…

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

风机桨叶故障诊断(六) 利用自编码器进行特征学习 在之前的工作中,我已经初步构建了三层的BP神经网络,并已经从样本集的选取,模型的选择(隐含层神经元个数),和输出层神经元阈值选择这…

风机桨叶故障诊断(七) 滑动窗与非极大值抑制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账…