OpenCV 3.1 ANN прогнозирует возврат nanC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 OpenCV 3.1 ANN прогнозирует возврат nan

Сообщение Anonymous »

Я пытаюсь реализовать нейронную сеть с помощью библиотеки OpenCV ANN. У меня было рабочее решение, но после обновления до OpenCV 3.1 оно перестало работать. Поэтому я создал упрощенный код для тестирования, но проблема все еще остается. ИНС успешно обучена, но когда я пытаюсь вызвать предсказание со строкой из trainData, оно возвращает Mat значений nan. Код

cv::Ptr< cv::ml::ANN_MLP > nn = cv::ml::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(cv::TermCriteria(cv::TermCriteria::MAX_ITER, (int)100000, 1e-6));

cv::Mat trainData(15, 4, CV_32FC1);
trainData.at(0, 0) = 5.5f; trainData.at(0, 1) = 3.5f; trainData.at(0, 2) = 1.3f; trainData.at(0, 3) = 0.2f;
trainData.at(1, 0) = 6.5f; trainData.at(1, 1) = 2.8f; trainData.at(1, 2) = 4.5999999f; trainData.at(1, 3) = 1.5f;
trainData.at(2, 0) = 6.3000002f; trainData.at(2, 1) = 2.3f; trainData.at(2, 2) = 4.4000001f; trainData.at(2, 3) = 1.3f;
trainData.at(3, 0) = 6.0f; trainData.at(3, 1) = 2.2f; trainData.at(3, 2) = 4.0f; trainData.at(3, 3) = 1.0f;
trainData.at(4, 0) = 4.5999999f; trainData.at(4, 1) = 3.0999999f; trainData.at(4, 2) = 1.5f; trainData.at(4, 3) = 0.2f;
trainData.at(5, 0) = 5.0f; trainData.at(5, 1) = 3.2f; trainData.at(5, 2) = 1.2f; trainData.at(5, 3) = 0.2f;
trainData.at(6, 0) = 7.4000001f; trainData.at(6, 1) = 2.8f; trainData.at(6, 2) = 6.0999999f; trainData.at(6, 3) = 1.9f;
trainData.at(7, 0) = 6.0f; trainData.at(7, 1) = 2.9000001f; trainData.at(7, 2) = 4.5f; trainData.at(7, 3) = 1.5f;
trainData.at(8, 0) = 5.0f; trainData.at(8, 1) = 3.4000001f; trainData.at(8, 2) = 1.5f; trainData.at(8, 3) = 0.2f;
trainData.at(9, 0) = 6.4000001f; trainData.at(9, 1) = 2.9000001f; trainData.at(9, 2) = 4.3000002f; trainData.at(9, 3) = 1.3f;
trainData.at(10, 0) = 7.1999998f; trainData.at(10, 1) = 3.5999999f; trainData.at(10, 2) = 6.0999999f; trainData.at(10, 3) = 2.5f;
trainData.at(11, 0) = 5.0999999f; trainData.at(11, 1) = 3.3f; trainData.at(11, 2) = 1.7f; trainData.at(11, 3) = 0.5f;
trainData.at(12, 0) = 7.1999998f; trainData.at(12, 1) = 3.0f; trainData.at(12, 2) = 5.8000002f; trainData.at(12, 3) = 1.6f;
trainData.at(13, 0) = 6.0999999f; trainData.at(13, 1) = 2.8f; trainData.at(13, 2) = 4.0f; trainData.at(13, 3) = 1.3f;
trainData.at(14, 0) = 5.8000002f; trainData.at(14, 1) = 2.7f; trainData.at(14, 2) = 4.0999999f; trainData.at(14, 3) = 1.0f;

cv::Mat trainLabels(15, 1, CV_32FC1);
trainLabels.at(0, 0) = 0; trainLabels.at(1, 0) = 0;
trainLabels.at(2, 0) = 0; trainLabels.at(3, 0) = 0;
trainLabels.at(4, 0) = 0; trainLabels.at(5, 0) = 0;
trainLabels.at(6, 0) = 1; trainLabels.at(7, 0) = 0;
trainLabels.at(8, 0) = 0; trainLabels.at(9, 0) = 0;
trainLabels.at(10, 0) = 1; trainLabels.at(11, 0) = 0;
trainLabels.at(12, 0) = 1; trainLabels.at(13, 0) = 0; trainLabels.at(14, 0) = 0;

cv::Mat layers = cv::Mat(3, 1, CV_32SC1);
layers.row(0) = cv::Scalar(trainData.cols);
layers.row(1) = cv::Scalar(4);
layers.row(2) = cv::Scalar(1);
nn->setLayerSizes(layers);
nn->train(trainData, cv::ml::SampleTypes::ROW_SAMPLE, trainLabels);

cv::Mat out;
nn->predict(trainData.row(6), out);

for (int y = 0; y< out.cols; y++) {
std::cout

Подробнее здесь: https://stackoverflow.com/questions/368 ... eturns-nan
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»