opencv2.4.10神经网络api的使用:
#include <opencv2/ml/ml.hpp>
//创建:
CvANN_MLP bp;
//下载
bp.load("test.xml")
//预测
bp.predict(in,out)
/*定义神经网络及参数*/
CvANN_MLP bp; //bp网络
CvANN_MLP_TrainParams params; //bp网络参数
params.train_method = CvANN_MLP_TrainParams::BACKPROP; //使用简单的BP算法,还可使用RPROP
params.bp_dw_scale = 0.1;
params.bp_moment_scale = 0.1;
//params.term_crit=cvTermCriteria(CV_TerMCrIT_ITER+CV_TERMCRIT_EPS,5000,0.01);
/*设置网络层数,训练数据*/
/*BACKPROP表示使用back-propagation的训练方法,使用BACKPROP有两个相关参数:bp_dw-scale,bp_moment_scale
RPROP即最简单的propagation训练方法,使用PRPOP有四个相关参数:rp_dw0,rp-dw_plus,rp_dw_minus,rp_dw_min,rp_dw_max
一个是权值更新率bp_dw_scale和权值更新冲量bp_moment_scale。
这两个量一般情况设置为0.1就行了;太小了网络收敛速度会很慢,太大了可能会让网络越过最小值点
Mat layerSizes = (Mat_<int>(1, 3) << IN_Dimension,HID_LAYERS,OUT_Dimension);//含有两个隐含层的网络结构,输入、输出层各3个节点
bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM);//激活函数为SIGMOID函数,还可使用高斯函数(CvANN_MLP::GAUSSIAN),阶跃函数(CvANN_MLP::IDENTITY)
//训练
bp.train(trainingDataMat, labelsMat, Mat(), Mat(), params);//训练的接口train()
bp.save(bpxml);//存储模型
opencv3.4.4
/*定义神经网络及参数*/
Mat layerSizes = (Mat_<int>(1, 3) << IN_Dimension,HID_LAYERS,OUT_Dimension);//含有两个隐含层的网络结构,输入、输出层各3个节点
/*layerSizes设置了有两个隐含层的网络结构:输入层,两个隐含层,输出层。输入层和输出层节点数均为2,中间隐含层每层有两个节点
create第二个参数可以设置每个神经节点的激活函数,默认为CvANN_MLP::SIGMOID_SYM
*/
bp->setLayerSizes(layerSizes);//设置层数
bp->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.1, 0.1);//激活函数
bp->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);//训练方法
//激活函数为SIGMOID函数,还可使用高斯函数(CvANN_MLP::GAUSSIAN),阶跃函数(CvANN_MLP::IDENTITY)
**//训练**
Ptr<TrainData> trainData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);//创建训练数据,ROW_SAMPLE表示data中每行为一个样本
bp->train(trainData);//训练的接口train()
bp->save(bpxml);//存储模型
cout << "训练完成!"<<endl;
Ptr<ANN_MLP> bp = ANN_MLP::load("test.xml");//创建并加载保存的网络