Tôi đang cố gắng đào tạo một mạng thần kinh bằng cách sử dụng bản ngã backpropagation. trong OpenCV 2.3. Tuy nhiên nó không được dự đoán chính xác .... thậm chí không phải trên tập dữ liệu đào tạo. Ai có thể vui lòng giúp tôi tìm thấy những gì sai ở đây?Tại sao mạng neural không dự đoán?
training_feature_matrix - Nx69 ma trận của phao đánh giá cao
training_age_matrix - NX4 ma trận của phao đánh giá cao
test_feature_matrix - Mx69 ma trận của phao đánh giá cao
test_age_matrix - ma trận MX4 của phao đánh giá cao
tính năng ma trận (nêu trên) như sau: [0.123435, 0.4542665, 0.587545, ... 68 giá trị như vậy + giá trị cuối cùng '1.0 hoặc 2.0' tùy thuộc vào nam/nữ)
ma trận độ tuổi (đã đề cập ở trên) giống như: [1, 0, 0, 0; 1, 0, 0, 0; 0, 1, 0, 0; ...] ở đây 1s cho thấy lớp tuổi (bé, trẻ em, người lớn, cũ) hàng tương ứng của ma trận tính năng thuộc về.
đây là đoạn code: Tôi gọi hàm 'MLP' sử dụng ma trận trên như thông số)
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;
}
EDIT Ngoài ra, ann.get_weights (0) & ann.get_layer_sizes() được trở về giá trị rác nhưng ann.get_layer_count() đang trả lại giá trị chính xác 3.
Cảm ơn :)
ann.get_weights (0) & ann.get_layer_sizes() trở lại con trỏ, vì vậy sẽ giống như "rác" nếu bạn in chúng như bạn có. Phần còn lại của mã của bạn có vẻ ổn, bạn có chắc dữ liệu của mình tốt không? Chính xác thì "nó không dự đoán chính xác" nghĩa là gì? – Bull
@ user2151446 làm cách nào để trích xuất các giá trị từ các con trỏ đó? không dự đoán chính xác có nghĩa là .... ma trận dự đoán đầu ra mà tôi nhận được là ma trận các giá trị nổi ... có giá trị dương, âm và cũng có giá trị lớn hơn 1 .... không có ý nghĩa ... dữ liệu đầu vào hoàn toàn ổn định ... mỗi dữ liệu dạng ma trận nổi như yêu cầu OpenCV ... – learner
@ user2151446 Tôi có thể trích xuất các giá trị từ ann.get_weights() nhưng không bale để trích xuất ann.get_layer_sizes() giá trị. Tôi nên làm gì? – learner