2013-05-17 38 views
5

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 :)

+1

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

+0

@ 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

+0

@ 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

Trả lời

1

Nhân giống lại không phải lúc nào cũng hội tụ. Nó có khả năng nổ tung và tạo ra vô nghĩa. Điều này có thể xảy ra nếu giá trị epsilon hoặc momentum_scale quá lớn. Động lượng của bạn có vẻ như đang ở đỉnh cao của những gì có thể hoạt động và tôi sẽ cố gắng giảm nó.

2

Đã lâu kể từ khi câu hỏi đó được hỏi nhưng tôi sẽ chia sẻ câu trả lời. Tôi đã có một vấn đề tương tự với giá trị đầu ra của sigmoid. Nó được giải quyết ngay bây giờ. Bạn có thể kiểm tra vấn đề của tôi ở đây:

OpenCV Neural Network Sigmoid Output

Để tóm tắt các lỗi, nó được xảy ra bởi vì các thông số mặc định của tạo chức năng MLP của. Sử dụng như sau: ann.create (lớp, CvANN_MLP :: SIGMOID_SYM, 1, 1).

+0

cảm ơn thông tin bạn đã nhập! Tôi đánh giá cao nó! Sẽ dùng thử sớm ... – learner

Các vấn đề liên quan