我正在尝试使用 OpenCV 在 C++ 中训练神经网络。
我无法在 cv::Mat*(或 Mat*,如果使用命名空间 cv)与 CvMat* 之间进行转换,我将不胜感激。
让我详细说明:
我有两个 cv::Mat* 类型的数据结构。第一个是特征向量集,第二个是预期输出集。
cv::Mat *feat = new cv::Mat(3000, 100, CV_32F, featureData);
cv::Mat *op = new cv::Mat(3000, 2, CV_32F, expectedOutput);
(这些是特征向量长度 = 100 和输出状态 = 2 的 3000 个数据点)
这两个矩阵已经填充了正确尺寸的数据,并且在控制台上打印样本数据时似乎工作正常。
神经网络已初始化为:
int layers_array[] = {100,200,2}; //hidden layer nodes = 200
CvMat* layer = cvCreateMatHeader(1, 3, CV_32SC1);
cvInitMatHeader(layer, 1,3,CV_32SC1, layers_array);
CvANN_MLP nnetwork;
nnetwork.create(layer, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);
现在,ANN 的 train 方法具有以下模板:
virtual int train( const CvMat* inputs, const CvMat* outputs,
const CvMat* sampleWeights, const CvMat* sampleIdx=0,
CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(),
int flags=0 );
我尝试使用以下代码在 cv::Mat * 和 CvMat * 之间进行转换:
CvMat featMat,opMat;
(&featMat)->cols = feat->cols;
(&featMat)->rows = feat->rows;
(&featMat)->type = CV_32F;
(&featMat)->data.fl = (float *)feat->data;
(&opMat)->cols = op->cols;
(&opMat)->rows = op->rows;
(&opMat)->type = CV_32F;
(&opMat)->data.fl = (float *)op->data;
//setting up the ANN training parameters
int iterations = network.train(&featMat, &opMat, NULL, NULL, trainingParams);
当我运行此代码时,我在控制台中收到以下错误消息:
**OpenCV Error: Bad argument (input training data should be a floating-point matrix withthe number of rows equal to the number of training samples and the number
of columns equal to the size of 0-th (input) layer) in CvANN_MLP::prepare_to_train, file ..\..\OpenCV-2.3.0-win-src\OpenCV-2.3.0\modules\ml\src\ann_mlp.cpp,
line 694**
我理解错误信息。但是,据我所知,我相信我并没有弄乱输入/输出层中的节点数量。
你能帮我理解发生了什么问题吗?