我准备将某书中的一个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谢谢!
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谢谢!
虽然写得很好,太专业了,理解起来有点困难。
而且c++版本在vs2005编译不通过。没办法了。估计出现错误的原因有2个:1、数值类型的使用。
2、引用和值传递出现差错。
m_sPatternName.size 改为 m_sPatternName.size()
sqrt(...) 改为 sqrtl(...)
都是vs2005提示出来的,按这个改至少神经网络的训练功能没问题(画图功能暂不考虑)。我也认为可能是引用和值传递出现差错,所以专门检查了这些点,正如原帖所说,该处理的貌似都处理了。
数值类型的使用方面,没有出现int和double运算的情况,而且专门测试了几处复杂的计算点,貌似没有发现浮点误差。究竟是什么问题呢?希望大家再帮我看看,谢谢。
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;
}无论如何谢谢大家!
谢谢!