我正在尝试使用OpenCV的神经网络:
ANN::ANN() { // 4行1列,类型为32位短整型。 CvMat* neural_layers = cvCreateMat(4, 1, CV_32SC1); cvSet1D(neural_layers, 0, cvScalar(2)); // 输入 cvSet1D(neural_layers, 1, cvScalar(30)); // 隐藏层 cvSet1D(neural_layers, 2, cvScalar(30)); // 隐藏层 cvSet1D(neural_layers, 3, cvScalar(1)); // 输出 // 使用Sigmoid函数初始化ANN。 this->network = new CvANN_MLP(neural_layers, CvANN_MLP::SIGMOID_SYM, // 激活函数 1, // alpha = 1 1); // beta = 1}
训练参数:
void ANN::train() { // 准备样本矩阵。 CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(); // cvTermCriteria( CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 1000, 0.01 ); params.train_method = CvANN_MLP_TrainParams::BACKPROP; params.bp_dw_scale = 0.01; params.bp_moment_scale = 0.05; // 终止条件。 params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100000, // 0.1); // 开始训练网络。 this->network->train( this->inputs, this->outputs, this->weights, 0, // 样本开始索引。 params, // 训练参数。 1 // UPDATE_WEIGHTS );}
但是隐藏层的尺寸似乎完全不起作用,因为我将其从3改为30,结果完全没有变化。
然后我改变了alpha和beta的值,但这也没有任何变化。
我的代码哪里出了问题?
==== 我的训练和测试样本: ====
y = cos(x) + sin(x)
-0.758732841028 41.0938207976 27.23675954231.15370020129 21.1456884544 38.8524658070.298333522748 37.4369795032 51.24493857111.8800004748 96.2375790658 44.2418473915-1.78419644641 80.3189155018 77.9060673705...
回答:
你的epsilon值可能过大,导致学习过程发散。我猜你现在设置的是0.1。尝试将epsilon设置为更小的值,例如0.0000001,0.000001,0.00001。较小的epsilon可能会导致收敛速度变慢,但至少你应该能看到进展。
顺便提一下,这里有一个关于在OpenCV中使用SVM和MLP的很棒的教程。 https://raw.github.com/bytefish/opencv/master/machinelearning/doc/machinelearning.pdf