敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)

前面我们神经网络在mfcc语音识别中,小试牛刀,再没什么进展,主要还停留在理论理解透彻而已,近期在blob匹配相似度对比中实战,发现问题还不少。

1,没有对截距b更新

启用截距迭代的好处,参数收敛变快

  //更新截距b1,b2,b3;  

   bb[2] = b3 = (float)(b3 - 0.5 * 吆西);                 
            bb[0] = b1 = (float)(b1 - 0.5 * 吆西 * w5 * 吆西1);
            bb[1]= b2 = (float)(b2 - 0.5 * 吆西 * w6 * 吆西2);

2,求导公式中的数值用更新前还是更新后的?

使用更新前的,很容易想明白,但程序中没那么好写。下面就是用了更新后的值:(程序中的bug)

  //bb[0]= b1 = (float)(b1 - 0.5 * 吆西* weight5* 吆西1);
            //bb[1]= b2 = (float)(b2 - 0.5 * 吆西 * weight6* 吆西2);

3,一副轮廓图矩阵输入,发现失败,为什么?是特征值太多了?有1000个,为什么mfcc可以,5个特征

没有实战,瞎用,一口想吃个胖子

4,打算还是用五个特征,1000个特征输入的干掉了,恢复原版

5,学习有下限,没上限,为什么?没有工作在非线性区域

使用一个斑点blob匹配到的五个特征,参数稳定后,为什么,数值下探有限,而无上限,这学习的参数感觉用处不大,很失望,就像一旦阀门打开,再就管不住了,比如斑点的外接矩形w=20,h=30,是成功的,给定(15,25),bpnet失败,给定(200,300),bpnet的答案是ok,这怎么受得了?(2000,3000)也可以,奇葩!

最后怀疑,学会了求导,忘记了求导的定义域,想起sigmod函数定义域,发现-10,10间效果好,当时碰巧,mfcc的特征结果分布在0-15之间,发现在12左右稳定的参数,给100,也ok,参数不变化,但是触碰到7,就不行了(你能怀疑的地方,一定会是最容易出差错的地方,果然,编程中屡试不爽)

看下图,sigmod非线性区域-4,4最好

​​​​​​​

 

6,全部初始化0.1和随机初始化0-1之间为参数,为什么稳定的参数结果不一样?五个特征基本相同的情形下,最后发现这个关系不大

为什么是0-1之间的?还是要去看函数\sum_{}^{}wt+b,及1/(1+exp(-(\sum_{}^{}wt+b)))

7,为什么建议隐含层用双曲正切函数?

他们说是,解决一个方向跑,还有解决不对称的问题 

三层网络,隐含层用双曲正切函数与sigmod差别不大。

 outh1 = 1 / (1 + Math.Exp(-neth1));
  outh2 = 1 / (1 + Math.Exp(-neth2));

  //hide->out
            double netho1 = outh1 * w5 + outh2 * w6 + b3 * 1;
            double outho1 = 1 / (1 + Math.Exp(-netho1));//输出层函数保持原样20221025

上面是原来的sigmod,下面隐含层用双曲正切函数:

    outh1 = 2 / (1 + Math.Exp(-2 * neth1)) - 1;//隐含层函数使用新函数20221025
            outh2 = 2 / (1 + Math.Exp(-2 * neth2)) - 1;//隐含层函数使用新函数20221025

  //hide->out
            double netho1 = outh1 * w5 + outh2 * w6 + b3 * 1;
            double outho1 = 1 / (1 + Math.Exp(-netho1));//输出层函数保持原样20221025

8,为什么归一化?归一化的原因和梯度有关系,为了不反复调整学习率,所以归一化可以让梯度稳定,学习率稳定。

斑点轮廓出来后,主要特征基本是不变的,举个例子,比如:轮廓上两点最远距离=383

最远距离两点中心到质心距离=32,hu矩1=0.00698,hu矩2=0.000285,轮廓点数=1183,刚好5个特征,主要是验证bpnet,归一化到(3.83,3.2,6.98,2.85,1.183),发现还是没上限,

(383,3.2,6.98,2.85,1183)仍然可以,参数没变化。

是不是精度不够,上调了迭代精度,久违的上限出现了,虽然没下限好,继续逼近函数的非线性工作区域,双曲正切函数(-1.7,1.7),sigmod(-4,4),

又借鉴网上的归一化,终于两次归一化起了效果,

9,为什么极大提高迭代精度,会出现参数震荡?不收敛,可能是步长的问题,或者是区间已经很小了

还有就是迭代精度,使得上下限弹性灵敏,从0.00001更改为0.0000001,不能再提高精度了,否则,参数会不停变化,很难稳定。

总结看出,改变迭代精度,合适就好,归一化也很重要,函数的定义域x,值域y,以及bpnet设计工作在非线性区域,都很重要

研究总是有意义的,没有白走的路,经过改进bpnet,数据(383,3.2,6.98,2.85,1183)就不行了。3.83只能浮动+-0.2左右,其他几个基本差不多,我是其他不变调一个,如果都调,应该限制更加严格。     

矩阵相似度的比较,其实就是特征匹配。因为这个话题,等来了机会改进了bpnet。

我的bpnet,两次归一化,应该还有改进空间。有机会,期待中。。。

 bpnet神经网络看来还是可以用在矩阵相似度的比较中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值