用ANN对自己的数据集分类
来源:互联网 发布:python标准输入输出 编辑:程序博客网 时间:2024/05/16 11:27
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%
- 用ANN对自己的数据集分类
- 用Adaboost对自己的数据分类
- 用SVM对自己的数据分类
- 用CNN工具箱对自己的数据集分类
- 用自己的数据完成“分类”
- mnist数据集在caffe(windows)上的训练与测试及对自己手写数字的分类
- 数据挖掘学习------------------4-分类方法-4-神经网络(ANN)
- 用自己训练好的caffemodel来对自己的图片做分类
- Windows+caffe+libsvm对图片数据集的分类
- Windows+caffe+libsvm对图片数据集的分类
- 用深度神经网络对Iris数据集进行分类的程序--tensorflow
- 用朴素贝叶斯对wine数据集分类
- ANN人工神经网络基础分类
- caffe对自定义数据集进行分类
- 用caffe对自己的图片进行分类,包含详细代码
- 对数据进行分类
- 利用贝叶斯分类器对fetch_20newsgroups数据集进行分类
- Android端运行Tensorflow的demo去分类自己的数据集
- 在页面上用action传递参数到后台出现乱码的解决方法
- Linux系统Load average负载详细解释
- 2016年4月编程语言排行榜 Visual Basic正渐行渐远
- 解决IDEA自动重置LanguageLevel和JavaCompiler版本的问题
- 读书笔记(Verilog HDL那些事儿_建模篇0)
- 用ANN对自己的数据集分类
- 梳理caffe代码im2col(十七)
- java序列化和serialVersionUID
- java异常处理 try catch finally
- 教务管理系统-Struct2注解使用拦截器(Interceptor)
- muleESB的第一个开发实例-HelloWorld(二)
- 使用PHP的ZipArchive类实现多个文件的zip压缩包打包下载
- synchronized关键字
- java之JFrame边界布局