【问题标题】:Why is neural network not predicting?为什么神经网络不能预测?
【发布时间】:2013-05-12 09:51:55
【问题描述】:

我正在尝试使用反向传播算法训练神经网络。在 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表示特征矩阵对应行所属的年龄类别(婴儿、儿童、成人、老人)。

代码如下:我使用上述矩阵作为参数调用“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) 和 ann.get_layer_sizes() 正在返回垃圾值,但 ann.get_layer_count() 正在返回正确的值 3。

谢谢:)

【问题讨论】:

  • ann.get_weights(0) & ann.get_layer_sizes() 返回指针,所以如果你像以前一样打印它们,它们看起来就像“垃圾”。您的其余代码似乎没问题,您确定您的数据是好的吗? “它没有正确预测”到底是什么意思?
  • @user2151446 如何从这些指针中提取值?没有正确预测意味着......我得到的输出预测矩阵是一个浮点值矩阵......有正值,负值以及大于 1 的值......它没有意义......输入数据非常好...每个都按照 OpenCV 的要求采用浮点矩阵的形式...
  • @user2151446 我能够从 ann.get_weights() 中提取值,但不能提取 ann.get_layer_sizes() 值。我该怎么办?
  • 使用 2.3 版本有什么特别的原因吗?可以试试最新的 2.4.6 吗?
  • 你为什么把你的结果大致转换成int?我想你的结果是一个充满零的矩阵......

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


【解决方案1】:

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

OpenCV Neural Network Sigmoid Output

总结这个错误,它是由于mlp的create函数的默认参数而发生的。像这样使用:ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1)

【讨论】:

    【解决方案2】:

    反向传播并不总是收敛。它很可能会爆炸并产生废话。如果epsilon 或momentum_scale 值太大,则很可能出现这种情况。您的动力似乎处于可能起作用的最高端,我会尝试降低它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2012-05-06
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多