2015-09-14 2 views
1

Я пытаюсь реализовать простой пример нейронной сети в OpenCV версии 3.0.0. Согласно latest reference. Чтобы сделать все просто, я использую случайные 15 примеров от iris data set для обучения. Я также уменьшил выходные данные до 2, просто чтобы сделать вещи намного проще.OpenCV 3/Neural Networks/error в прогнозе/Ptr < ANN_MLP >/C++

где объявлены trainData и trainLabels как:

Mat trainData(15, 4, CV_32FC1); //15 examples with 4 features each 
Mat trainLabels(15, 1, CV_32FC1); 

trainData:

[5.5, 3.5, 1.3, 0.2; 
6.5, 2.8, 4.5999999, 1.5; 
6.3000002, 2.3, 4.4000001, 1.3; 
6, 2.2, 4, 1; 
4.5999999, 3.0999999, 1.5, 0.2; 
5, 3.2, 1.2, 0.2; 
7.4000001, 2.8, 6.0999999, 1.9; 
6, 2.9000001, 4.5, 1.5; 
5, 3.4000001, 1.5, 0.2; 
6.4000001, 2.9000001, 4.3000002, 1.3; 
7.1999998, 3.5999999, 6.0999999, 2.5; 
5.0999999, 3.3, 1.7, 0.5; 
7.1999998, 3, 5.8000002, 1.6; 
6.0999999, 2.8, 4, 1.3; 
5.8000002, 2.7, 4.0999999, 1] 

trainLabels:

[0; 
0; 
0; 
0; 
0; 
0; 
1; 
0; 
0; 
0; 
1; 
0; 
1; 
0; 
0] 

код нейронной сети компилирует и работать без ошибок до предсказать , Вот sniplet:

Ptr<ANN_MLP> nn = ANN_MLP::create(); 
nn->setActivationFunction(cv::ml::ANN_MLP::SIGMOID_SYM); 
nn->setTrainMethod(cv::ml::ANN_MLP::BACKPROP); 
nn->setBackpropMomentumScale(0.1); 
nn->setBackpropWeightScale(0.1); 
nn->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)100000, 1e-6)); 

//setting the NN layer size 
cv :: Mat layers = cv :: Mat (4 , 1 , CV_32SC1); 
layers . row (0) = cv :: Scalar (4) ; 
layers . row (1) = cv :: Scalar (4) ; 
layers . row (2) = cv :: Scalar (4) ; 
layers . row (3) = cv :: Scalar (1) ; 
nn->setLayerSizes(layers); 
nn->train(trainData, ROW_SAMPLE, trainLabels); 

Но всякий раз, когда я пытаюсь сделать «предсказать», я получаю «ошибка сегментации (ядро сбрасывали)» Ошибка:

nn->predict(trainData.row(1)); 

Что здесь проблема, и как можно Я чиню это? Спасибо.

ответ

0

Для справки в Python я использую: trainData. getTestResponses(), где trainData - это вся структура моих входных данных.

Надеюсь, это поможет ... Новая структура OpenCV 3 смутила меня сначала, но я ценю методы, в которых все делается сейчас.

+0

Его эквивалент в C++ - «виртуальный Mat cv :: ml :: TrainData :: getTestResponses() const», и он возвращает «исходные» значения ответа тестовых данных. Я ранее (ошибочно) отметил это сообщение как правильный ответ, но просто понял, что «getTestResponses()» не имеет ничего общего с предсказанием. – SoajanII

+0

Я действительно согласен. Я не прошел успешную подготовку и получил надлежащий результат с любым обучением NN OpenCV 3 ... –

+0

Так как я не могу получить решение, я использую Theano на Python в эти дни. Он имеет очень хорошую документацию и довольно гибкий. – SoajanII

-1

Попробуйте изменить порядок функций setActivationFunction() и setLayerSize(). Вы должны позвонить setLayerSize() до setAtctivationFunction(). Это было решение в моем случае (OpenCV 3.1).

Смежные вопросы