opencv - OpenCV 中神经网络的层大小不起作用

标签 opencv machine-learning computer-vision neural-network regression

我正在尝试使用 OpenCV 的神经网络:

ANN::ANN() {
  // 4 rows and 1 col with the type of 32 bits short.
  CvMat* neural_layers = cvCreateMat(4, 1, CV_32SC1);
  cvSet1D(neural_layers, 0, cvScalar(2));   // inputs
  cvSet1D(neural_layers, 1, cvScalar(30));  // hidden
  cvSet1D(neural_layers, 2, cvScalar(30));  // hidden
  cvSet1D(neural_layers, 3, cvScalar(1));   //output
  // Init ANN with sigmoid function.
  this->network = new CvANN_MLP(neural_layers, 
                                CvANN_MLP::SIGMOID_SYM, // active function
                                1,    // alpha = 1
                                1);   // beta = 1
}

训练参数:

void ANN::train() {
  // Prepare for sample matrix.
  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;
  // Terminate condition.
  params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,
                                    100000,   // 
                                    0.1);
  // Start to train the network.
  this->network->train(
                    this->inputs,
                    this->outputs,
                    this->weights,
                    0,          // Samples start index.
                    params,     // Traning parameters.
                    1           // UPDATE_WEIGHTS
                    );
}

但是隐藏层的大小似乎根本不起作用,因为我将它从 3 更改为 30,结果根本没有改变

然后我更改了 alpha 和 beta 的值,但这也没有任何改变。

我的代码有什么问题?

==== 我的训练和测试样本:====

y = cos(x) + sin(x)

-0.758732841028 41.0938207976   27.2367595423
1.15370020129   21.1456884544   38.852465807
0.298333522748  37.4369795032   51.2449385711
1.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

关于opencv - OpenCV 中神经网络的层大小不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16827517/

相关文章:

opencv - 当我构建 OpenCV 时,它无法识别我安装的 ffmpeg

c++ - 尝试设置 openCV、MinGW 编译器时出现 CMake 错误

多个图像上的 C++ OpenCV 线性代数?

python - 调整 MLPRegressor 超参数

machine-learning - 在训练神经网络的整个过程中,数据集的验证误差是否会高于测试误差?

opencv - 镜头畸变模型与校正模型

python - 使用 Shiny 对象改进背景提取 (OpenCV/Python)

python - 使用 RandomizedSearchCV 在 sklearn 中进行超参数调整需要花费大量时间

opencv - 特征长度如何取决于 SVM 分类器中的预测

c++ - 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标