我正在尝试使用反向传播算法训练神经网络。在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显示特征矩阵对应行的年龄类别(婴儿, child ,成人,老年人)。
这是代码:我使用上述矩阵作为参数调用“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。
谢谢 :)
最佳答案
自问这个问题已经很久了,但我会分享答案。 sigmoid的输出值也有类似的问题。现在解决了。您可以在这里检查我的问题:
OpenCV Neural Network Sigmoid Output
总结一下错误,是由于mlp的create函数的默认参数引起的。像这样使用:ann.create(layers,CvANN_MLP::SIGMOID_SYM,1,1)。