用ANN对自己的数据集分类

原创 2016年05月31日 15:39:41

http://blog.csdn.net/NNNNNNNNNNNNY/article/details/50973583用他的来对我自己的数据集分类  traindata是328X1000的矩阵  trainlabel是328X2的标签


#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/ml/ml.hpp>  
#include <iostream>  
#include <string>  
using namespace std;
using namespace cv;
int main()
{
CvANN_MLP bp;
CvANN_MLP_TrainParams params;
params.train_method = CvANN_MLP_TrainParams::BACKPROP;  //(Back Propagation,BP)反向传播算法
params.bp_dw_scale = 0.1;
params.bp_moment_scale = 0.1;
CvMLData trainlabels,traindatas,testlabels,testdatas;
trainlabels.read_csv("train_label.csv");
cv::Mat finaltrainlabelprimer= cv::Mat(trainlabels.get_values(), true);
float* finaltrainlabelprimernew = (float*)finaltrainlabelprimer.data;
Mat finaltrainlabel(328, 2, CV_32FC1, &finaltrainlabelprimernew);
traindatas.read_csv("train_data.csv");
cv::Mat finaltraindataprimer = cv::Mat(traindatas.get_values(), true);
float* finaltraindataprimernew = (float*)finaltraindataprimer.data;
Mat finaltraindata(328,1000, CV_32FC1, &finaltraindataprimernew);
Mat layerSizes = (Mat_<int>(1, 5) << 2, 2, 2, 2, 2); 
bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//训练 报错说我的前两个参数要是floating-matrix
bp.train(finaltraindata, finaltrainlabel, Mat(), Mat(), params);  
testdatas.read_csv("test_data.csv");
cv::Mat finaltestdata = cv::Mat(testdatas.get_values(), true);
Mat responseMat;
bp.predict(finaltestdata, responseMat);
return 0;
}

把Mat layerSizes = (Mat_<int>(1, 5) << 2, 2, 2, 2, 2); 改成Mat layerSizes = (Mat_<int>(1, 5) << 1000, 2, 2, 2, 2); 还是错  这里实际是1000 因为输入层要和维数一致

我懂了 我重新用新数据

取整了的数据 每个样本4维特征  然后label是 第二类的第二类的label是 然后程序没什么变 还是:

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/ml/ml.hpp>  
#include <iostream>  
#include <string>  
using namespace std;
using namespace cv;
int main()
{
CvANN_MLP bp;
CvANN_MLP_TrainParams params;
params.train_method = CvANN_MLP_TrainParams::BACKPROP;  //(Back Propagation,BP)反向传播算法
params.bp_dw_scale = 0.1;
params.bp_moment_scale = 0.1;
CvMLData trainlabels, traindatas, testlabels, testdatas;
trainlabels.read_csv("exampletrainlabel.csv");
cv::Mat finaltrainlabelprimer = cv::Mat(trainlabels.get_values(), true);
//float* finaltrainlabelprimernew = (float*)finaltrainlabelprimer.data;
//Mat finaltrainlabel(550, 2, CV_32FC1, &finaltrainlabelprimernew);
traindatas.read_csv("exampletraindata.csv");
cv::Mat finaltraindataprimer = cv::Mat(traindatas.get_values(), true);
//float* finaltraindataprimernew = (float*)finaltraindataprimer.data;
//Mat finaltraindata(550, 4, CV_32FC1, &finaltraindataprimernew);
Mat layerSizes = (Mat_<int>(1, 5) << 4, 2, 2, 2, 2);
bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM);
//bp.train(finaltraindata, finaltrainlabel, Mat(), Mat(), params);
bp.train(finaltraindataprimer, finaltrainlabelprimer, Mat(), Mat(), params);
testdatas.read_csv("exampletestdata.csv");
cv::Mat finaltestdata = cv::Mat(testdatas.get_values(), true);
Mat responseMat;
bp.predict(finaltestdata, responseMat);
for (int i = 0; i < responseMat.rows; ++i)
{
float* p = responseMat.ptr<float>(i);
if (p[0] > p[1])
cout <<0.9<< " " << 0.1<< endl;
else
cout << 0.1 << " " << 0.9<< endl;
}
return 0;
}

这样就不报错了 结果虽然都分到第二类去了 但没关系  特征是乱写的  不报错了就行   至少证明了数据不能像我之前的那样不能是科学计数法表示的 也不能是复数   还有发现csv读数据后直接转成Mat也行  可能因为本来在matlab里就是double  所以不用转成float了吧 另外我不知道不知道这里 将ANN的结果 重新归类部分错了没   

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/ml/ml.hpp>  
#include <iostream>  
#include <string>  
using namespace std;
using namespace cv;


int main()
{
CvANN_MLP bp;
CvANN_MLP_TrainParams params;
params.train_method = CvANN_MLP_TrainParams::BACKPROP;  //(Back Propagation,BP)反向传播算法
params.bp_dw_scale = 0.1;
params.bp_moment_scale = 0.1;
CvMLData trainlabels, traindatas, testlabels, testdatas;
trainlabels.read_csv("trainlabel.csv");
cv::Mat finaltrainlabelprimer = cv::Mat(trainlabels.get_values(), true);

traindatas.read_csv("traindata.csv");
cv::Mat finaltraindataprimer = cv::Mat(traindatas.get_values(), true);

Mat layerSizes = (Mat_<int>(1,5) << 1000, 2,2,2, 2);
bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM);


bp.train(finaltraindataprimer, finaltrainlabelprimer, Mat(), Mat(), params);


testdatas.read_csv("testdata.csv");
cv::Mat finaltestdata = cv::Mat(testdatas.get_values(), true);


testlabels.read_csv("testlabel.csv");
cv::Mat finaltestlabel = cv::Mat(testlabels.get_values(), true);


Mat responseMat;
bp.predict(finaltestdata, responseMat);


int correct = 0;
float accurency;
for (int i = 0; i < responseMat.rows; ++i)
{
float* p = responseMat.ptr<float>(i);
float* being = finaltestlabel.ptr<float>(i);
if (p[0] > p[1])
cout <<0.9<< " " <<0.1<< "      " << being[0] << " " << being[1] << endl;
else
cout <<0.1<< " " << 0.9 << "      " << being[0] << " " << being[1]<< endl;


if (((p[0] > p[1]) && (being[0] > being[1])) || ((p[0] < p[1]) && (being[0] < being[1])))
++correct;
}
cout << endl;
accurency = (float)correct / finaltestlabel.rows;
cout << accurency << endl;
return 0;
}

 刚刚重新用新特征试了下:

左边是测出来的标签  右边是实际上的标签  准确率:81.52%

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

opencv knn,svm,ann,人脸识别类的使用总结

1、 knn 需要引用的头文件  #include 用到的opencv类:KNearest   *knn;          得到训练数据和相应的标记:trainData,将每一个训练矩阵归一化为...

神经网络ANN分类器及OpenCV实现

OpenCV中实现神经网络分类非常简单,使用CvANN_MLP定义分类器,CvANN_MLP_TrainParams设置训练参数,添加训练数据,使用train和predict进行训练和预测。     ...

在opencv3中的机器学习算法练习:对OCR进行分类

OCR (Optical Character Recognition,光学字符识别),我们这个练习就是对OCR英文字母进行识别。得到一张OCR图片后,提取出字符相关的ROI图像,并且大小归一化,整个图...

用CNN工具箱对自己的数据集分类

在github上下载了一个Deeplearningtoolbox的工具箱 里面各种deeplearning 很全 我用其中的CNN对自己的数据集分类  但很麻烦 很多地方都得改动  http://do...

ANN(人工神经网络)基础知识

ANN是一个非线性大规模并行处理系统1.1人工神经元的一般模型神经元的具有的三个基本要素1、一组连接,连接的强度由个连接上的权值表示,若为正,则表示是激活,为负,表示,抑制 2、一个求和单元:用于求...

ANN人工神经网络基础分类

Google Tensorflow's simple neural network playground:  Tinker With a Neural Network Right Here in ...
  • ABERGO
  • ABERGO
  • 2016-09-27 11:07
  • 1255

MLP(多层神经网络)介绍

写在前面的        接触神经网络(ANN)的时间很长了,以前也只是学了学原理,做过一个BPN的练习,没有系统的总结过,最近看Torch的源码,对MLP有了更多的了解,写写自己学到的东西吧,算是...

Opencv中ANN神经网络使用示例

前一段儿想用opencv做一下数字识别,用神经网络做识别。 在网上搜了一下关于opencv中ANN的使用方法,@小魏的修行路 的【模式识别】OpenCV中使用神经网络 CvANN_MLP 这篇文章写...

ANN神经网络代码在Matlab中的简单实现

在数学建模比赛中的简单尝试눈_눈.................木有任何卵用 ಥ_ಥ
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)