c++ - 为什么我的 C++ OpenCV 3.4.1 神经网络预测如此糟糕?
问题描述
我正在尝试使用 OpenCV 3.4.1 在 C++ 中开发人工神经网络,目的是能够识别 33 个不同的字符,包括数字和字母,但我得到的结果总是错误的。
我已经用不同的参数值测试了我的代码,比如我用于训练的 sigmoid 函数的 alpha 和 beta、反向传播参数或隐藏节点的数量,但是,虽然结果有时会有所不同,但通常往往是以下形状的向量:
分类结果:
[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;
}
解决方案
推荐阅读
- python - ECS Airflow 1.10.2 性能问题。操作员和任务需要 10 倍的时间
- javascript - D3js v5 中的有界静态力布局
- python - 如何将向量钳位在某个量级内?
- python - 在进程之间更新熊猫数据框
- python-3.x - 无法使用 TKinter GUI 中的多处理模块执行多个功能
- python - 如何将标题/列添加到现有的熊猫脚本
- aem - AEM - 数据狡猾的资源儿童html
- regex - 为什么 Selenium 在连字符之前插入反斜杠?
- asynchronous - Flutter 用于并行执行的多个异步方法
- sql-server - 如何修复“错误:调用目标已引发异常”。SSIS 脚本任务发送到多封电子邮件时出错