神经网络一个简单实例
OpenCV 的 ml 模块实现了人工神经网络(人工神经网络(Artificial Neural NetworksArtificial Neural Networks,, ANNANN))最典型的多层感知器多层感知器 ((multi-layer perceptrons, MLPmulti-layer perceptrons, MLP))模型模型。由于ml 模型实现的算法都继承自统一的 CvStatModel 基类,其 训练和预测的接口都是 train(),predict(),非常简单。 下面来看神经网络 CvANN_MLPCvANN_MLP 的使用~ 定义神经网络及参数:定义神经网络及参数: [cpp][cpp]view plain copy 1.//Setup the BPNetwork 2. CvANN_MLP bp; 3.// Set up BPNetwork s parameters 4. CvANN_MLP_TrainParams params; 5. params.train_=CvANN_MLP_TrainParams::BACKPROP; 6. params.bp_dw_scale=0.1; 7. params.bp_moment_scale=0.1; 8.//params.train_=CvANN_MLP_TrainParams::RPROP; 9.//params.rp_dw0 = 0.1; 10.//params.rp_dw_plus = 1.2; 11.//params.rp_dw_minus = 0.5; 12.//params.rp_dw_min = FLT_EPSILON; 13.//params.rp_dw_max = 50.; 可以直接定义 CvANN_MLP 神经网络,并设置其参数。 BACKPROPBACKPROP 表示使用 back-propagation 的训练方法,RPROP 即最简单的 propagation 训练方法。 使用 BACKPROP 有两个相关参数:bp_dw_scale 即 bp_moment_scale: 使用 PRPOP 有四个相关参数:rp_dw0, rp_dw_plus, rp_dw_minus, rp_dw_min, rp_dw_max: 上述代码中为其默认值。 设置网络层数,训练数据:设置网络层数,训练数据: [cpp][cpp]view plain copy 1.// Set up training data 2.floatfloat labels[3][5] = {{0,0,0,0,0},{1,1,1,1,1},{0,0,0,0,0}}; 3. Mat labelsMat(3, 5, CV_32FC1, labels); 4. 5.floatfloat trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,2 3,24,25} }; 6. Mat trainingDataMat(3, 5, CV_32FC1, trainingData); 7. Mat layerSizes=(Mat_(1,5) 5,2,2,2,5); 8. bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM 9.//CvANN_MLP::GAUSSIAN 10.//CvANN_MLP::IDENTITY 11. bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params); layerSizes 设置了有三个隐含层的网络结构:输入层,三个隐含层,输出层。输入层和输出 层节点数均为 5,中间隐含层每层有两个节点。 create 第二个参数可以设置每个神经节点的激活函数,默认为 CvANN_MLP::SIGMOID_SYM,即 Sigmoid 函数,同时提供的其他激活函数有Gauss 和 阶跃函数。 使用训练好的网络结构分类新的数据:使用训练好的网络结构分类新的数据: 然后直接使用 predict 函数,就可以预测新的节点: [cpp][cpp] view plain copy 1.Mat sampleMat = (Mat_(1,5) i,j,0,0,0); 2. Mat responseMat; 3. bp.predict(sampleMat,responseMat); 完整程序代码:完整程序代码: [cpp][cpp] view plain copy 1.//The example of using BPNetwork in OpenCV 2.//Coded by L. Wei 3.#include 4.#include 5.#include 6.#include 7.#include 8. 9.usingusing namespacenamespace std; 10. usingusing namespacenamespace cv; 11. 12. intint main() 13. { 14.//Setup the BPNetwork 15. CvANN_MLP bp; 16.// Set up BPNetwork s parameters 17. CvANN_MLP_TrainParams params; 18. params.train_=CvANN_MLP_TrainParams::BACKPROP; 19. params.bp_dw_scale=0.1; 20. params.bp_moment_scale=0.1; 21.//params.train_=CvANN_MLP_TrainParams::RPROP; 22.//params.rp_dw0 = 0.1; 23.//params.rp_dw_plus = 1.2; 24.//params.rp_dw_minus = 0.5; 25.//params.rp_dw_min = FLT_EPSILON; 26.//params.rp_dw_max = 50.; 27. 28.// Set up training data 29.floatfloat labels[3][5] = {{0,0,0,0,0},{1,1,1,1,1},{0,0,0,0,0}}; 30. Mat labelsMat(3, 5, CV_32FC1, labels); 31. 32.floatfloat trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,2 3,24,25} }; 33. Mat trainingDataMat(3, 5, CV_32FC1, trainingData); 34. Mat layerSizes=(Mat_(1,5) 5,2,2,2,5); 35. bp.cr