[英]Unwieldy CvMat* in ANN using OpenCV
我正在嘗試使用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的訓練方法具有以下模板:
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**
我了解錯誤消息。 但是,據我所知,我相信我並沒有弄亂輸入/輸出層中的節點數量。
您能幫我了解問題出在哪里嗎?
請盡量避免使用指向cv :: Mat以及CvMat *的指針。
幸運的是, CvANN_MLP :: train有一個重載 ,將cv :: Mat當作args,所以改用它:
cv::Mat feat = cv::Mat(3000, 100, CV_32F, featureData);
cv::Mat op = cv::Mat(3000, 2, CV_32F, expectedOutput);
int layers_array[] = {100,200,2}; //hidden layer nodes = 200
cv::Mat layers = cv::Mat (3, 1, CV_32SC1, layers_array );
CvANN_MLP nnetwork;
nnetwork.create(layers, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);
int iterations = nnetwork.train(feat, op, cv::Mat(), cv::Mat(), CvANN_MLP_TrainParams());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.