5

backpropagation algo를 사용하여 신경망을 학습하려고합니다. 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는 연령대 (아기, 어린이, 성인, 노인)의 특징 행렬이 속하는 행을 표시합니다. 여기

코드이다 : I 호출 파라미터로서 상기 매트릭스를 이용하여 '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; 
} 

EDIT 상기 ann.get_weights (0) & ann.get_layer_sizes() 가비지 값을 반환하는 하지만 ann.get_layer_count() 올바른 값 3.

감사합니다 :)

+1

ann.get_weights (0) & ann.get_layer_sizes()는 포인터를 반환하므로 사용자가 원하는대로 인쇄하면 "쓰레기"처럼 보입니다. 나머지 코드는 괜찮은 것 같습니다. 데이터가 양호한가요? 정확하게 "예측이 정확하지 않다"는 것은 무슨 뜻입니까? – Bull

+0

@ user2151446 어떻게 그 포인터에서 값을 추출합니까? 올바르게 예측하지 못했습니다 .... 출력 예측 행렬은 float 값의 행렬입니다. 양수, 음수 값 및 1보다 큰 값이 있습니다. 의미가 없습니다 ... OpenCV가 요구하는대로 float-matrix 형식의 입력 데이터가 완벽하게 ... ... – learner

+0

@ user2151446 ann.get_weights()에서 값을 추출 할 수 있지만 ann.get_layer_sizes()를 추출하려면 베일이 아닙니다. 값. 어떻게해야합니까? – learner

답변

1

돌아 가기 전파 항상 수렴하지 않습니다 반환합니다. 폭력을 일으키고 말도 안되는 소리를내는 것 같습니다. 이는 엡실론 또는 momentum_scale 값이 너무 큰 경우입니다. 당신의 추진력은 무엇이 효과가 있을지의 최상위에있는 것처럼 보입니다. 나는 그것을 줄이려고 노력할 것입니다.

2

그 질문 이후로 오랜 시간이 걸렸지 만 답변을 공유 할 것입니다. Sigmoid의 출력 값에도 비슷한 문제가있었습니다. 이제 해결되었습니다. 당신은 여기 내 문제를 확인할 수 있습니다

OpenCV Neural Network Sigmoid Output

오류를 요약하면, 그것 때문에 MLP의 생성 함수의 기본 매개 변수의 발생하는됩니다. 다음과 같이 사용하십시오 : ann.create (layers, CvANN_MLP :: SIGMOID_SYM, 1, 1).

+0

감사합니다! 감사합니다! 곧 시험해 보겠습니다 ... – learner

관련 문제