Я пытаюсь использовать 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);
(Это 3000 точек данных с длиной вектора элемента = 100 и состоянием вывода = 2)
Эти две матрицы были заполнены данными правильных размеров и, кажется, работают нормально, когда образцы данных были напечатаны на консоли.
Нейронная сеть была инициализирована как:
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, так что используйте вместо этого:
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());