OpenCV 3.1.0 NB分类器,将所有MNIST训练样本分类为单个类别

OpenCV 3.1.0 NB Classifier classifying all MNIST training samples into single class

本文关键字:MNIST 样本 分类 单个类 NB 分类器 OpenCV      更新时间:2023-10-16

我正在尝试使用OpenCV 3.1.0为MNIST数据集训练NB分类器。我使用了准备好的CSV培训和数据文件http://pjreddie.com/projects/mnist-in-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本身的问题。请告知。

谢谢。

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

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

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

    看看那里有没有什么问题?(样品数量、尺寸等)