为什么神经网络没有预测?

时间:2013-05-17 09:15:19

标签: c++ opencv machine-learning computer-vision neural-network

我正在尝试使用反向传播算法训练神经网络。在OpenCV 2.3中。 然而,它没有正确预测....甚至没有训练数据集。有人可以帮我找到错在哪里吗?

training_feature_matrix - 浮动值的Nx69矩阵

training_age_matrix - 浮动值的Nx4矩阵

test_feature_matrix - 浮点值的Mx69矩阵

test_age_matrix - 浮点值的Mx4矩阵

特征矩阵(如上所述)如:[0.123435,0.4542665,0.587545,... 68-这样的值+最后一个值'1.0或2.0',取决于它的男性/女性)

年龄矩阵(如上所述)如:[1,0,0,0; 1,0,0,0; 0,1,0,0; ...]这里1s显示特征矩阵的相应行所属的年龄类(婴儿,儿童,成人,旧)。<​​/ p>

这里是代码:我使用上面的矩阵作为参数调用'mlp'函数)

cv::Mat mlp(cv::Mat& training_feature_matrix, cv::Mat& training_age_matrix, cv::Mat& test_feature_matrix, cv::Mat& test_age_matrix)
{
cv::Mat layers = cv::Mat(3, 1, CV_32SC1);
layers.row(0)  = cv::Scalar(69);
layers.row(1)  = cv::Scalar(36);
layers.row(2)  = cv::Scalar(4);    //   cout<<layers<<"\n";

CvANN_MLP ann;
CvANN_MLP_TrainParams params;
CvTermCriteria criteria;
criteria.max_iter = 10000;
criteria.epsilon  = 0.001;
criteria.type     = CV_TERMCRIT_ITER + CV_TERMCRIT_EPS;
params.train_method = CvANN_MLP_TrainParams::BACKPROP;
params.bp_dw_scale  = 0.1;
params.bp_moment_scale = 0.1;
params.term_crit  = criteria;

ann.create(layers, CvANN_MLP::SIGMOID_SYM);
ann.train(training_feature_matrix, training_age_matrix, cv::Mat(), cv::Mat(), params);

cv::Mat predicted(test_age_matrix.rows, 4, CV_32SC1);
for(int i = 0; i < test_feature_matrix.rows; i++)
{
  cv::Mat response(1, 4, CV_32F);
  cv::Mat sample = test_feature_matrix.row(i);
  ann.predict(sample, response);
  for (int g = 0; g < 4; g++)
  {
    predicted.at<int>(i,g) = response.at<float>(0,g);
  } 
}
   cout << "\n";
   cout << ann.get_weights(0) << "\n";
   cout << ann.get_layer_sizes() << "\n";
   cout << ann.get_layer_count() << "\n\n";

return predicted;
}

编辑此外,ann.get_weights(0)&amp; ann.get_layer_sizes()返回垃圾值,但ann.get_layer_count()返回正确的值3.

谢谢:)

2 个答案:

答案 0 :(得分:2)

问题已经很久了,但我会分享答案。我对sigmoid的输出值有类似的问题。它现在解决了。你可以在这里查看我的问题:

OpenCV Neural Network Sigmoid Output

总结错误,由于mlp的create函数的默认参数,它正在发生。使用如下:ann.create(layers,CvANN_MLP :: SIGMOID_SYM,1,1)

答案 1 :(得分:1)

反向传播并不总是收敛。它很可能会爆炸并产生废话。如果epsilon或momentum_scale值太大,则可能会出现这种情况。你的势头看起来是可行的最高端,我会尝试减少它。