新手上路之opencv神经网络有监督学习分类

来源:互联网 发布:淘宝雨晴家有假货吗 编辑:程序博客网 时间:2024/05/02 04:23

        水平有限难免错误,批判性观看。

         神经网络的理论太多了,下面给个链接大家可以去看下:

         http://blog.csdn.net/byxdaz/article/details/534855

         原理能懂当然好了,其实不懂也不影响使用,只要明白神经网络的基础结构就行了。下面来说说opencv里面使用神经网络需要注意的地方。

        

         第一步是训练

         神经网络和svm的不同是需要在调用train方法之前创建结构。即有多少层,每层有多少神经元。创建方法如下:

         int classLableCount=5;
         Mat layerSizes=(Mat_<int>(1,3) <<feature_vec_mat.cols,300,classLableCount);

         其中feature_vec_mat是Mat结构,他的rows表示总共的训练样本,cols表示训练样本的维度,classLableCount表示需要分类数量,上面方法表示神经网络有三层,输入层有feature_vec_mat.cols维,隐藏层有300个神经元,输出层有5个维度。这样训练好的神经网络的参数大有feature_vec_mat.cols*300这么多个。上面如果写成

         Mat layerSizes=(Mat_<int>(1,3) <<2000,1000,1000,5);

          这样表示有4层,输入层,隐藏层,隐藏层,输出层。需要维护的权值就有2000*1000*1000这么多。不过不用担心,有个模型叫做卷积神经网络,它的共享权值可以解决这些问题。遗憾的是opencv还没有引入,对于新手来说需要等等再研究。

         神经网在训练的时候不是像一般的方法在train方法的时候给标签,在predict返回标签。神经网络在训练的时候是给的向量,返回的也是向量。

          CvANN_MLP mlp;

          mlp.train(feature_vec_mat,label_mat,Mat(),Mat(),params);

          这里的label_mat不是n*1而是n*classcout维度的,例如feature_vec_mat第一行的向量对应的是标签为3的类,一共有5类,label_mat第一行就应该是0 0 1 0 0。

          params一般使用opencv文档中推荐的参数

         CvANN_MLP_TrainParams params;
         params.term_crit=cvTermCriteria( CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 1000, 0.01 );
         params.train_method=CvANN_MLP_TrainParams::RPROP;
         params.bp_dw_scale = 0.1;
         params.bp_moment_scale = 0.1;
         params.rp_dw0 = 0.1; 
         params.rp_dw_plus = 1.2;
         params.rp_dw_minus = 0.5;
         params.rp_dw_min = FLT_EPSILON; 
         params.rp_dw_max = 50.;

        

         第二步是检测

         mlp.predict(sample,res);

         两个参数都是Mat,其中res返回的是一个1*classcout维度的Mat,找到中间最大的数,就代表分类结果。

        

       









0 0
原创粉丝点击