Почему мой C ++ OpenCV 3.4.1 Neural Network так плохо предсказывает? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь разработать искусственную нейронную сеть на C ++, используя OpenCV 3.4.1, чтобы иметь возможность распознавать 33 различных символа, включая цифры и буквы, но результаты, которые я получаю, всегда неверны.

Я проверил свой код с различными значениями параметров, такими как альфа и бета сигмоидальной функции, которую я использую для обучения, параметры обратного распространения или количество скрытых узлов, но, хотя результат иногда меняется,обычно это имеет тенденцию быть вектором следующей формы:

Результат классификации:

[20.855789, -0.033862107, -0.0053131776, 0.026316155, -0.0032050854, 0.036046479, -0.025410429, -0,017537225, 0,015429396, -0,023276867, 0,013653283, -0,025660357, -0,051959664, -0,0032470606, 0,032143779, -0,011631044, 0,022339549, 0,041757714, 0,04414707, -0,044756029, 0,042280547, 0,012204648, 0,026924053, 0,016814215, -0,028257577, 0,05190875, -0,0070033628, -0,0084492415, -0.040644459, 0.00022287761, -0.0376678, -0.0021550131, -0.015310903]

То есть, независимо от того, какой символ я проверяю, всегда предсказывается, что анализируемый символ - это тот, кто находится в первой позициивектор символов, который сили соответствует номеру '1'.

Данные обучения получены из созданного мной файла .XML, который содержит 474 выборки (строки) с 265 атрибутами в каждой (столбцы).Что касается учебных классов, то, следуя совету, который я нашел в предыдущем вопросе на этом форуме, он получен из другого файла .XML, который содержит 474 строки, по одной для каждого образца обучения, и 33 столбца, по одному для каждого персонажа / класса.

Я прилагаю приведенный ниже код, чтобы вы, возможно, любезно догадались, что я делаю неправильно, и я заранее благодарен за любую помощь, которую вы можете предложить!:)

//Create the Neural Network
Mat_<int> layerSizes(1, 3);
layerSizes(0, 0) = numFeaturesPerSample;
layerSizes(0, 1) = nlayers;
layerSizes(0, 2) = numClasses;

//Set ANN params
Ptr<ANN_MLP> network = ANN_MLP::create();
network->setLayerSizes(layerSizes);
network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.6, 1); 
network->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);
Ptr<TrainData> trainData = TrainData::create(TrainingData, ROW_SAMPLE, classes);
network->train(trainData);

//Predict
if (network->isTrained())
{
    trained = true;
    Mat results;
    cout << "Predict:" << endl;
    network->predict(features, results); 
    cout << "Prediction done!" << endl;
    cout << endl << "Classification result: " << endl << results << endl;

    //We need to know where in output is the max val, the x (cols) is the class.
    Point maxLoc;
    double maxVal;
    minMaxLoc(results, 0, &maxVal, 0, &maxLoc);

    return maxLoc.x;
}
...