【问题标题】:Neural network for OCR (only digits)用于 OCR 的神经网络(仅限数字)
【发布时间】:2015-01-19 20:03:39
【问题描述】:

一直在研究用于 OCR 识别数字的神经网络。对于培训,我使用了从在线课程中获得的一组(取自 MNIST 数据库)。训练值在 -1.28 到 1.28 的范围内(我不知道为什么会这样,这可能是问题的根源,但我一直在努力从其他地方获取训练集,有什么建议吗?)。对于某些人原因是,预测函数的“输出”矩阵对于所有 10 个条目都是相同的值。基本上,神经网络不工作..

void neuralNet(Mat M, Mat label, Mat test) {
//M is the training set of dimension 5000 X 400  (the image size is 20 X 20 and there are 5000 samples
        //label is 5000 X 10 , where the columns correspond to the represented number. i.e. ( if the number is 5 
         //  label[x][5]=1 and all other elements of the row are 0.
         // test has dimension 1 X 400

Mat layerSizes = new Mat(3,1,CvType.CV_32S); //Setting up the layers
layerSizes.put(0,0,400);
layerSizes.put(1, 0, 25);
layerSizes.put(2, 0, 10);
//Creating the Neural Network
CvANN_MLP nnet = new CvANN_MLP(layerSizes,CvANN_MLP.SIGMOID_SYM,0.6,1);
//Create criteria
TermCriteria criteria = new TermCriteria(TermCriteria.COUNT+TermCriteria.EPS,1000,0.000001);
//Create training parameters
CvANN_MLP_TrainParams param = new CvANN_MLP_TrainParams();
param.set_term_crit(criteria);
param.set_train_method(CvANN_MLP_TrainParams.BACKPROP);
param.set_bp_dw_scale(0.1);
param.set_bp_moment_scale(0.1);

//Training
int iter = nnet.train(M, label,new Mat(), new Mat() ,param, 0);
System.out.println("Number of iteratins: "+ iter);

System.out.println("Running test...");
Mat testOut = new Mat(1,10,CvType.CV_32FC1);

nnet.predict(test,testOut);
System.out.println(testOut.dump());
double []t = null;
System.out.println("The recognised symbols are:");
double max=0;
int loc=-1;
for(int j=0;j<10;j++)
{
    t=testOut.get(0, j);

    if(max < t[0])
    {
        max=t[0];
        loc=j;
    }
}
System.out.println(loc);    }

testOut.dump() 结果为 [0 0 0 0 0 0 0 0 0 0] 我对此很陌生,但我对神经网络有“体面”的理解。如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您可以在此处获取 MNIST:yann.lecun.com/exdb/mnist。你检查输入矩阵的值了吗?他们是对的吗?
  • 很难说你的问题到底是什么。您能否编辑您的问题以明确它是什么?
  • 对不起。基本上,我的神经网络不工作。我想知道我是否设置正确。基本上我在输入层有 400 个节点,在隐藏层有 25 个节点,在输出层有 10 个节点。它只是给出并输出 [0 0 0 0 0 0 0 0 0 0]。

标签: opencv neural-network ocr


【解决方案1】:

这行代码

CvANN_MLP nnet = new CvANN_MLP(layerSizes,CvANN_MLP.SIGMOID_SYM,0.6,1);

给我一​​个印象,你使用 sigmoid。如果您的输入介于 -1.28 和 1.28 之间,则可能是相当大的问题根源,因为 sigmoid 建议使用值 [0, 1]。您最好从 sigmoig 切换到 tanh,但也将数据从 [-1.28, 1.28] 规范化为 [-1, 1],或者如果您想将 sigmoid 保留为 [0, 1]。

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多