用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%

基于keras的深度学习——分类

使用keras的深度学习来分类白葡萄酒还是红葡萄酒 首先介绍一下数据类型: 1.这个数据集包含了1599种红酒,4898种白酒; 2.输入数据特征: 1 - fixed acidity ...
  • u013817676
  • u013817676
  • 2018年01月08日 16:57
  • 66

Keras 使用自己的数据分类,并使用tensorboard记录的简单实例

Keras 使用自己的数据分类,并使用tensorboard记录的简单实例
  • Tourior
  • Tourior
  • 2017年11月30日 14:41
  • 186

ANN分类器.m

  • 2015年04月18日 14:53
  • 8KB
  • 下载

keras

大神笔记,转载自http://blog.csdn.net/u012162613/article/details/45397033 Keras简介 Keras是基于Theano的一个深度学习框架,它的设...
  • u011826745
  • u011826745
  • 2016年07月31日 00:15
  • 4755

ANN人工神经网络基础分类

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

opencv 学习之 SVM / ANN 图片分类(OPENCV3.2)

图片分类,VS2017 + OPENCV3.2 图片分两类,正负样本。最后一组测试。 速度较慢。可能图片太大。540*360....
  • u010477528
  • u010477528
  • 2017年09月06日 10:34
  • 979

ANN神经网络

ANN神经网络
  • forest_world
  • forest_world
  • 2016年07月12日 14:11
  • 500

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

OpenCV中实现神经网络分类非常简单,使用CvANN_MLP定义分类器,CvANN_MLP_TrainParams设置训练参数,添加训练数据,使用train和predict进行训练和预测。     ...
  • xukaiwen_2016
  • xukaiwen_2016
  • 2016年11月22日 23:23
  • 2813

ANN:ML方法与概率图模型

— 产生式模型(生成模型)估计联合概率P(x,y),因可以根据联合概率来生成样本:HMMs — 判别式模型(判别模型)估计条件概率P(y|x),因为没有x的知识,无法生成样本,只能判断分类:SVMs...
  • wishchin
  • wishchin
  • 2015年04月17日 20:44
  • 2361
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用ANN对自己的数据集分类
举报原因:
原因补充:

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