我准备将某书中的一个C++写的BP神经网络的例子改用C#实现。但是改写之后不知道什么地方出了问题,网络训练收敛变得及其慢了。原来的C++程序用20000多次迭代即可将积累误差缩小到阈值以下;我改写的C#程序迭代数十万次,积累误差距离阈值还是很远。我想可能是程序什么地方处理得不对。我是一行一行对照着改写的,并且检查了多遍,没有发现错误在哪里。下面是我改写的主要方式:1、C++中的vector<...>在C#中转为List<...>
2、C++中按值传入或返回的vector<...>,在C#中new List<...>的方式构造复本。
3、C++中按引用传入或返回的vector<...>,在C#中直接传递名称。
4、C++中用到vector<...>::iterator的地方,在C#全部改用数组下标的方式实现。
5、已经注意到了vector的end()指向的是末元素之后位置的问题。谁能帮我看看程序,对照一下我的C#和原来的C++,究竟是什么地方出了问题。
从这里下载:http://www.linjian.cn/temp/bp.rar主要是这几个文件(只是对BP神经网络的实现,其它的部分还没有改写):
CNeuralNet.cpp——NeuralNet.cs
CData.cpp——GestureData.cs
defines.h——Useful.cs谢谢!

解决方案 »

  1.   

    你的c++和c#版本的差异太大。
    虽然写得很好,太专业了,理解起来有点困难。
    而且c++版本在vs2005编译不通过。没办法了。估计出现错误的原因有2个:1、数值类型的使用。
    2、引用和值传递出现差错。
      

  2.   

    为什么要改写呢,想用的话,用VC把它封装成DLL不就可以用了吗?
      

  3.   

    C++版本在vs2005下编译有两个地方修改一下就可以了:
    m_sPatternName.size 改为 m_sPatternName.size()
    sqrt(...) 改为 sqrtl(...)
    都是vs2005提示出来的,按这个改至少神经网络的训练功能没问题(画图功能暂不考虑)。我也认为可能是引用和值传递出现差错,所以专门检查了这些点,正如原帖所说,该处理的貌似都处理了。
    数值类型的使用方面,没有出现int和double运算的情况,而且专门测试了几处复杂的计算点,貌似没有发现浮点误差。究竟是什么问题呢?希望大家再帮我看看,谢谢。
      

  4.   

    哈!我找到答案了!问题出在随机数生成器上,不应该每次都重新初始化Random,程序的一次执行用一同一个随机种子生成的数列的随机性才符合要求。用时间做种子每次都重新初始化Random有可能在连续时刻得到相同的随机数!原程序:        //生成-1~1的随机数
            static public double RandomClamped()
            {
                Random ran = new Random();
                double a = ran.NextDouble();
                double b = ran.NextDouble();
                return a - b;
            }改为:        //生成-1~1的随机数
            static Random ran = new Random();
            static public double RandomClamped()
            {
                double a = ran.NextDouble();
                double b = ran.NextDouble();
                return a - b;
            }无论如何谢谢大家!
      

  5.   

    能否发我一份,研究一下。邮箱 : [email protected]
    谢谢!
      

  6.   

    发我一份,我正在写这些东西,改好了我还你一份可以用的[email protected]
      

  7.   

    能给我发一份吗?谢谢啦!学习用[email protected]
      

  8.   

    你好楼主,能发给我一份么,我想学习一下:[email protected],谢谢了