Archive 2015 年 5 月 13 日

使用AForge.NET中的BP神经网络库实现异或逻辑

  调试神经网络时,感觉无论怎么测试数据,收敛都非常慢,总怀疑是不是AForge.Net的BP算法有问题,所以测试一下异或逻辑,代码如下:    private static void testXOR(){             var func = new AForge.Neuro.SigmoidFunction();             var network = new AForge.Neuro.ActivationNetwork(func,2,2,1);             AForge.Neuro.Learning.BackPropagationLearning bp = new AForge.Neuro.Learning.BackPropagationLearning (network);             double input = new double;             input  = new double{ 0, 0 };             input  = new double{ 0, 1 };             input  = new double{ 1, 0 };             input  = new double{ 1, 1 };             double output = new double;             output = new double{0};             output = new double{1};             output = new double{1};             output = new double{0};             double error=1;             while(error>0.01){                 error = bp.RunEpoch(input,output);                 Console.WriteLine("error:"+error);             }             for (int i = 0; i < 4; i++) {                 var result =  network.Compute (input );                 Console.WriteLine(string.Format("output:{0},realresult:{1}",result,output));             }         }   输出结果如下:           测试了一下,只要有个隐藏层神经元为2,就足够学习到异或逻辑,而为1,很难收敛,隐藏神经元为20以上时,数值变化已经在小数点后的十几位了,也很难收敛,这说明并不是神经元越多就越好,同时增加层数时也会发现这种情况。…

Read More

单层感知器与哲学上简单思考

  无意间又翻回了单层的感知器,为了加深体会,所以又写码测试了一下,其运算速度确实很快,在使用 Threshold 激活函数的前提下,对手写的前一千个样本进行识别,识别速度极快,但是对于已经训练过的数据,效果也很一般,只有77%左右,但对于没有识别过的数据,就惨不忍睹了,几乎全错。这就是感知器的特点,它在低维的层面对进行线性可分,而遇到线性不可分的问题时,就会出现这样的情况。      这个也可以抽象到现实的哲学中,单层感知器,它就是如同在一个平面上,试图通过划线来对事物进行区域划分,并且这种划分是非此即彼的,如果有很多分类的东西混在一起时,必须要有符合目标特征的函数才能够更好的识别目标事物,而这种往往在现实中是不可能的。   如果只在极低的维度上对事情进行分类,也就是死硬派的认为,凡事非此即是彼,那么有再多的对客观事物有再正确认识,在进行教育后,也是会谬误百出,所以思考问题时只考虑某一种单一的划分条件,是不能成立的。   阴阳的认识也是如此,阴阳总是相对的,这种相对实际上就是在不同环境与条件下,对阴阳进行赋予了不同的权重,但是光仅仅是这样是不够的,如果局限在某一个单一的方面去划分,用阴阳来认识事物就难免会出现极大的问题。        像感知器这样的情况,直接根据已知事物的特征,然后判断相差多少,去不断调整认识,虽然这样有益于正确认识事物,但也会带来很强的经验主义,而经验主义的结果就是导致对于新事物难受接受,从而总是会判断错误。           大多数情况下,分类发生错误,不是说客观事物无法分类,而是分类的方法不对就会导致错误,这一点一定要明确。

Read More