【问题标题】:OpenCV 3.1.0 NB Classifier classifying all MNIST training samples into single classOpenCV 3.1.0 NB 分类器将所有 MNIST 训练样本分类为单个类
【发布时间】:2016-07-14 15:19:23
【问题描述】:

我正在尝试使用 OpenCV 3.1.0 为 MNIST 数据集训练 NB 分类器。我使用来自http://pjreddie.com/projects/mnist-in-csv/ 的准备好的 CSV 训练和数据文件来训练 NB 分类器。我使用剪切和粘贴稍微修改了这个 CSV 文件以适应 OpenCV 的要求。训练完分类器后,我尝试用它对训练数据集进行分类,但它是将所有样本分类为 0 类。训练数据集有 784 个维度、10 个类和 60000 个样本。我的训练代码如下:

#include <iostream>
#include <opencv2/ml.hpp>

using namespace cv;
using namespace cv::ml;

int main(int argc, char* argv[])
{
    String trainingDataFile(argv[1]);
    Ptr<TrainData> trainingData = TrainData::loadFromCSV(trainingDataFile,0);

    Ptr<NormalBayesClassifier> nbClassifier = NormalBayesClassifier::create();
    nbClassifier->train(trainingData);

    nbClassifier->save(trainingDataFile+"_trainedNBParams.dat");

    return 0;
}

测试代码只是从文件中重新加载 NB 分类器并对所有样本进行分类。我成功地将此代码用于另一个具有 128 个维度、10 个类和 10000 个样本的较小数据集。我不确定这是否是我的代码、培训方法或 OpenCV 本身的问题。请指教。

谢谢。

【问题讨论】:

    标签: c++ opencv machine-learning computer-vision opencv3.0


    【解决方案1】:

    如果没有其他信息,很难判断问题可能是什么。

    1. OpenCV:只要您使用的是稳定版本,我怀疑问题出在 openCV 库中。
    2. 训练方法:特别是考虑到数据是 MNIST,我怀疑您是否必须进行任何微调才能获得合理的结果。只需将参数保留为 opencv 的默认值就可以了。你的方法似乎也不错。
    3. 我的猜测是在数据中,因为这是唯一改变并导致失败的变量。你能尝试迭代训练数据吗

      for(int i = 0; i < trainingData->getSamples().size(); i++) {
          // check contents of data
      }
      

      看看那里有什么问题吗? (样本数、尺寸等)

    【讨论】:

    • 很遗憾,直到明天我才能回复您。不过,我会尽快完成。
    • 训练数据是使用内置的 loadFromCSV 函数加载的,我检查了样本和响应矩阵的大小,可以确认它们符合预期。
    猜你喜欢
    • 2017-11-21
    • 2015-12-16
    • 2021-07-03
    • 1970-01-01
    • 2018-04-10
    • 2013-04-11
    • 2019-01-10
    • 2012-04-18
    • 2016-01-22
    相关资源
    最近更新 更多